<?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[PHX Consulting]]></title><description><![CDATA[Thoughts on technical leadership, career development, and mentorship for software engineers of all skill levels]]></description><link>https://perspectives.phx.nz</link><image><url>https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png</url><title>PHX Consulting</title><link>https://perspectives.phx.nz</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Apr 2026 01:24:16 GMT</lastBuildDate><atom:link href="https://perspectives.phx.nz/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[PHX Ltd]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[todofixthis@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[todofixthis@substack.com]]></itunes:email><itunes:name><![CDATA[Phoenix Zerin]]></itunes:name></itunes:owner><itunes:author><![CDATA[Phoenix Zerin]]></itunes:author><googleplay:owner><![CDATA[todofixthis@substack.com]]></googleplay:owner><googleplay:email><![CDATA[todofixthis@substack.com]]></googleplay:email><googleplay:author><![CDATA[Phoenix Zerin]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The shouting match: retrospective anti-patterns]]></title><description><![CDATA["Well, I think we should definitely prioritise the deployment pipeline issues&#8212;"]]></description><link>https://perspectives.phx.nz/p/the-shouting-match-retrospective</link><guid isPermaLink="false">https://perspectives.phx.nz/p/the-shouting-match-retrospective</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Wed, 24 Sep 2025 23:00:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e9a96543-5aec-492c-a566-ad7754eb73c9_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"Well, I think we should definitely prioritise the deployment pipeline issues&#8212;"</p><p>"No, no, the real problem is that the frontend team keeps changing requirements without consulting us&#8212;"</p><p>"That's not fair! We only change things when the designs&#8212;"</p><p>"Can we please focus on what actually matters here? The database performance is killing us and&#8212;"</p><p>You glance around the room. Three people are trying to speak at once, voices getting louder. The junior developer has stopped taking notes and is staring at their laptop. The tester in the corner hasn't said a word in twenty minutes.</p><p>Sound familiar? You're witnessing the third anti-pattern in our <a href="https://perspectives.phx.nz/t/retro-anti-patterns">retrospective anti-patterns series</a>: the shouting match. We've already covered <a href="https://perspectives.phx.nz/p/retro-anti-patterns-group-therapy-session">the group therapy session</a> and <a href="https://perspectives.phx.nz/p/retro-anti-patterns-blame-game">the blame game</a>, and today we're tackling what happens when the loudest voices drown out everyone else: the shouting match.</p><p>You'll know you're dealing with a shouting match when one or two team members dominate through volume, persistence, or strong opinions, effectively shutting out others.</p><p>Your retrospective ends with apparent agreement, but several team members haven't bought in&#8212;they've simply been overpowered. Thoughtful and introverted members quietly check out, feeling unheard.</p><p>If this resonates, you're not alone. What makes this particularly challenging is that teams solve the wrong problems whilst real issues remain hidden, wasting time and tanking morale.</p><p>But when you get input from your entire team, you uncover insights no single perspective could provide. Picture a retrospective where the quiet backend developer shares an insight about technical debt, and a junior developer chimes in to point out a communication pattern senior members missed. Instead of the loudest voice winning, the best ideas rise through genuine collaboration.</p><p>That's the kaupapa we're working towards, and here are some ways that you can make it happen:</p><h2>Structure the session for inclusion</h2><p><strong>Use techniques that give everyone opportunities to contribute.</strong> Try silent brainstorming or "sticky storming"&#8212;everyone writes thoughts on sticky notes and adds them to the board without talking. No one can challenge or remove others' ideas, preventing early ideas from anchoring discussion.</p><p><strong>Similarly, use "dot voting" to prioritise topics for discussion.</strong> Each participant gets fixed votes to allocate to the sticky notes on the board however they want, then discuss from most to least votes. Again, no talking during voting, and no challenging others' choices.</p><h2>Create a rotating facilitator role</h2><p>Domineering team members rarely shut out others intentionally&#8212;<strong>usually a friendly nudge is all it takes to get them to share the spotlight</strong>.</p><p>Start by taking the facilitator role yourself to model the behaviour. Your job is to notice participation patterns and invite quieter voices. Picture your team&#8217;s DevOps engineer talking for five minutes about deployment issues while backend developers sit quietly. You step in: "We haven't heard from the backend folks yet&#8212;any thoughts on this deployment issue?" Suddenly you learn about a database connection issue that explains everything.</p><p>Or when your opinionated senior developer keeps dominating: "Thanks Mark. Jane, what's your perspective?"</p><p>For members uncomfortable sharing publicly, they can send their contributions to the facilitator via a private channel (such as Slack DMs), and the facilitator will present them anonymously to the group.</p><p>Once the team gets comfortable with this dynamic, rotate the facilitator role among team members. This prevents any single person from wielding too much influence over discussions and ensures everyone develops the skill of creating inclusive conversations.</p><h2>Let the retro get (a little bit) meta</h2><p>If seniority or role differences regularly affect participation, try acknowledging it during the retrospective. Sometimes calling out the dynamic will level the playing field and encourage participants to self-correct.</p><p>If the team do want to discuss how to better run retrospectives, just remember: <a href="https://perspectives.phx.nz/p/retro-anti-patterns-blame-game">there are no people problems, only process problems</a>&#8212;gently redirect from naming names to improving process.</p><h2>Making it stick</h2><p>The key is consistency&#8212;these techniques only work if used regularly and adapted based on your team's dynamics.</p><p>Pay attention to who's speaking and who isn't. Notice which topics generate heated discussion and whether you're getting balanced input. **The goal isn't silencing strong voices, but amplifying quiet ones.**</p><h2>Your next step</h2><p>During your team's next retrospective, try this: look around the room (or video call) and identify who typically speaks up and who stays quiet. Then <strong>pick just one technique</strong> from this post&#8212;silent brainstorming, dot voting, rotating facilitator, or naming the group dynamic&#8212;and <strong>commit to using it consistently for the next three retrospectives.</strong> Notice what changes.</p><p>We're making good progress through retrospective anti-patterns! I'll be back in a few weeks to talk about Fear of Commitment and how to help teams that struggle to implement process improvements.</p>]]></content:encoded></item><item><title><![CDATA[Task forces]]></title><description><![CDATA[When critical deliverables grind to a halt, most project leads reach for familiar tools: more status meetings, tighter deadlines, and additional resources. Here's why that doesn't work...and what to do instead.]]></description><link>https://perspectives.phx.nz/p/task-forces</link><guid isPermaLink="false">https://perspectives.phx.nz/p/task-forces</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Wed, 27 Aug 2025 20:17:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When critical deliverables grind to a halt, most project managers reach for familiar tools: more status meetings, tighter deadlines, and additional resources. Yes, I can feel you rolling your eyes already. We all know these tactics only make things worse&#8212;and yet we see leadership reach for them. Every. Single. Time.</p><p>Let me tell you a story about how I broke the cycle, and why the solution worked better than I could have possibly expected.</p><h2>The Problem: Cross-Team Deliverables Without Clear Ownership</h2><p>Last year, while leading a major architectural overhaul project, I was watching three critical deliverables languish despite having capable teams and adequate resources: go-live planning, performance testing, and data migration. These all cut across team boundaries with no clear ownership&#8212;and if there's one thing I know about project leadership<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, it's this: when you don't have a singular person accountable for making sure something gets done, it doesn't get done.</p><p>I knew I couldn't just arbitrarily assign these deliverables to existing teams&#8212;they'd have too many dependencies on other teams and would inevitably get stuck again. But I also couldn't take on planning and executing these myself; I'd become the ultimate bottleneck.</p><p>The solution hit me when I started thinking about matching communication structures to the work itself. <strong>If the work cut across team boundaries, why not create structures that did the same?</strong> So I decided to try something different: task forces.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><h2>The Experiment: Cross-Functional Task Forces</h2><p>For each stalled deliverable, I approached a capable team lead and asked them to assemble a dedicated cross-functional team. The conversation was easier than I'd expected&#8212;these team leads were already aware of and concerned about the deliverables that weren't progressing. They were keen to try a different approach, and frankly, they were excited about the additional responsibility.</p><p>Here's how I structured it&#8212;and this is where things got interesting. Each task force lead got their mandate&#8212;deliver X by Y date&#8212;and the freedom to <strong>negotiate</strong> for their own team members. They couldn't just conscript engineers; they had to k&#333;rero with the other team leads to take some of each team's capacity, with the understanding they'd have to give it back if they weren't utilising it effectively.</p><p><strong>That negotiation requirement turned out to be more of a feature than a bug.</strong> It created natural tension that put a check on task force size and ensured teams would grow or shrink as needed. But more importantly, it got the team leads talking and coordinating with each other constantly, which became the real game-changer.</p><h2>How Task Forces Actually Operated</h2><p>The task forces operated as lightweight teams, running regular standups, planning, and refinement meetings, but at a lower cadence than regular teams. Engineers often weren't 100% allocated, so they'd split time between their regular team mahi and task force mahi. Each task force lead represented both their team and their task force during project status meetings, and that way during my weekly check-ins with them, I could focus on providing guidance and coaching rather than directing activities.</p><p>What surprised me most was how little active leadership these task forces needed from me. <strong>Because the team leads had to negotiate regularly for resources, they were also planning together and learning from each other constantly.</strong> There was far less reliance on me to get into the details with them. Similarly, because engineers from multiple teams were also working together on technical challenges, information was flowing freely, and silos that had existed for months started breaking down naturally.</p><h2>Why It Worked: Systems-Level Change</h2><p>Now, I need to confess something: at the time this was absolutely one big experiment. I had a hunch it would work, but I didn't fully understand why until I started reading about systems thinking later. It turns out that what we'd stumbled onto was something systems thinker Donella Meadows calls <a href="https://donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/">high-leverage intervention points</a>. <strong>Instead of trying low-impact changes like adding more people or tightening deadlines, we'd fundamentally altered how the system operated.</strong></p><p>The task forces changed the purpose of work units from maintaining departmental boundaries to achieving specific outcomes. They increased the power of self-organisation by letting teams develop their own rhythms and decision-making patterns. And they altered authority structures by empowering task force leads to negotiate for resources across traditional hierarchies. Looking back, it's no wonder the approach felt so different from typical project management interventions&#8212;we were working at a completely different level!</p><p>The results bore this out. <strong>All three deliverables were completed on time and to high quality standards...but the real transformation went deeper:</strong></p><ul><li><p>The constant negotiation between team leads created new information flows across the entire project.</p></li><li><p>Developers who'd never worked together began collaborating regularly.</p></li><li><p>Technical decisions that previously required lengthy approval chains happened in real-time.</p></li><li><p>Knowledge gaps that would have surfaced during testing were identified and addressed weeks earlier.</p></li><li><p>Task force leads developed new leadership skills that served them well beyond this project&#8212;they learned to navigate competing priorities, build consensus across departments, and drive results without formal authority.</p></li></ul><p>The broader project reflected these improvements too: we went live on schedule, doubled the performance of the previous system, and completed the data migration well ahead of the deadline.</p><h2>When to Use Task Forces</h2><p>So when should you try this approach? <strong>Task forces are particularly powerful when your project's challenges are structural rather than operational.</strong> Look for situations where multiple teams or departments need to coordinate closely, traditional reporting lines create bottlenecks, or success requires both deep technical expertise and broad organisational knowledge.</p><p>Rather than fighting against organisational constraints, task forces work with systems thinking principles to create new structures purpose-built for complex, cross-functional challenges. <strong>Sometimes the most effective intervention isn't working harder within existing constraints&#8212;it's changing the system itself.</strong></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Or rather, if there's one thing that this near-disaster taught me about project leadership...</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Or cross-functional teams, if you prefer a term that absolutely does not roll off the tongue.</p></div></div>]]></content:encoded></item><item><title><![CDATA[The Glue Trap]]></title><description><![CDATA[Getting stuck on technical tasks? Not getting the support you need from your teammates? Feeling tempted to pick up some documentation or coordination tasks to stay productive? Don't give in &#8212; this is a trap!]]></description><link>https://perspectives.phx.nz/p/the-glue-trap</link><guid isPermaLink="false">https://perspectives.phx.nz/p/the-glue-trap</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Wed, 23 Jul 2025 01:00:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b6b7524c-e2c7-4394-bf86-a97d2d88927e_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've noticed a distressing pattern that junior developers fall victim to, particularly those who've switched careers: when they hit technical roadblocks, they pivot toward <a href="https://www.noidea.dog/glue/">glue work</a> &#8212; the documentation, coordination, and communication tasks that keep projects moving.</p><p>It's an understandable move. Glue work feels productive, leverages existing strengths, and provides immediate validation when coding feels impossible. Over time, a junior dev who consistently engages in this type of work may even become the "documentation person" or "unofficial project manager" on the team, with these tasks being directly assigned.</p><p><strong>Be warned: this is a trap!</strong> It can be valuable for junior developers to learn how the business works and build relationships across the organisation, <strong>but if you're doing this at the expense of learning technical skills, you're stymieing your dev career.</strong></p><p>Partly this is because technical competence is what employers evaluate in performance reviews and interviews, but more importantly <strong>you need a solid technical foundation to be effective at glue work itself.</strong></p><p>Software is a sociotechnical system. Without deep technical understanding, you'll consistently misdiagnose problems &#8212; treating technical issues as communication failures<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, or proposing process solutions for architectural problems. If you focus on glue work as a distraction from your coding tasks, your impact will actually become <em>less</em> valuable over time &#8212; and you will be in for the shock of your life during your next performance review!</p><p>If you're caught in this trap, here's how to break out:</p><h1>Build habits for managing cognitive load</h1><p>Junior developers are <em>excellent</em> problem-solvers. When a junior developer gets stuck, it's almost never because they lack the capability to learn their way through the problem, but rather because they've exhausted their mental capacity trying to keep track of too many details.</p><p>This is why having reliable techniques to prevent the build-up of cognitive load is absolutely crucial. When you're deep into a coding task, you need habits you can rely on automatically to wrangle the mental overhead &#8212; freeing up your headspace to focus on learning and problem-solving.</p><p>The good news is these habits are entirely learnable. Start by practising <a href="https://perspectives.phx.nz/p/slow-is-smooth-and-smooth-is-fast">attacking problems methodologically</a>, <a href="https://perspectives.phx.nz/p/cross-contamination">avoiding cross-contamination</a>, and <a href="https://perspectives.phx.nz/p/siren-songs">managing distractions</a>. Work on building these habits during solo work and in pair programming sessions, and ask developers in your network how they manage their cognitive load. You'll discover surprisingly simple techniques that make a massive difference!</p><h1>Experiment with "page out" techniques</h1><p>Even with excellent cognitive load management habits, there will be times when a problem genuinely requires you to hold more information than your brain can comfortably handle. When you find yourself in this situation &#8211; feeling mentally overwhelmed and starting to lose track of important details &#8211; you need techniques to quickly offload information.</p><p>Just as a computer "pages out" extra data to the hard drive when RAM is full, you can use external tools to temporarily store information your brain doesn't need to track moment-to-moment. This frees up mental space to focus on the core problem without losing important context.</p><p>Effective techniques that I've observed in the wild include:</p><ul><li><p>drawing diagrams of components and connections</p></li><li><p>taking detailed notes and reviewing regularly</p></li><li><p>leaving breadcrumb comments throughout the code</p></li><li><p>physically modelling the system with cards on your desk</p></li></ul><p>Experiment with different approaches to find the ones that work for you, and practise reaching for them early &#8212; before you feel overwhelmed, not after.</p><h1>Ask for the right kind of help</h1><p>If you've been stuck in the glue trap for a while, breaking out requires more than just personal habit changes &#8212; you need your teammates to support you differently, too. Even highly skilled developers often struggle with mentoring effectively. They might think they're being helpful by taking over when you're stuck or giving you "easier" coordination tasks, but this actually reinforces the trap.</p><p>Here are some ways you can gently nudge them towards giving the right kind of help:</p><h2>During pair programming sessions</h2><ul><li><p>Ask to be the driver: "Could I take the keyboard? I learn better when I'm typing."</p></li><li><p>Resist accepting direct answers and instead ask for leading questions: "Rather than telling me the solution, could you help me think through what might be causing this?"</p></li><li><p>When senior devs offer to "just fix it quickly," push back gently: "I'd really value watching you work through the debugging process &#8212; could you talk me through your thinking?"</p></li></ul><h2>During your next one-to-one with your manager</h2><ul><li><p>Explain that you're refocusing on technical development and discuss what support you'll need from the team.</p></li><li><p>Be specific about the types of tasks you want to take on and the mentoring style that helps you learn best.</p></li></ul><h2>When glue tasks come your way in standups or sprint planning</h2><ul><li><p>Deflect diplomatically: "I'm keen to focus on building my technical skills right now &#8212; could someone else take this on?"</p></li><li><p>Suggest pairing glue work with technical components: "I could write that process doc if I can also build the automation script to go with it."</p></li></ul><p>Remember: a job is a relationship. Your manager and teammates want you to succeed, even if they don't always know how best to support you. By clearly communicating your goals and demonstrating your commitment to growth, you're making it easy for them to help you escape the glue trap and build the technical career you want.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Or worse, treating communication challenges as technical problems!</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Estimates that build trust (not stress)]]></title><description><![CDATA[Developers hate estimates, yet we keep getting asked to create them. This should tell us something important &#8212; estimates are valuable, just not for the reasons you might be thinking of.]]></description><link>https://perspectives.phx.nz/p/estimates</link><guid isPermaLink="false">https://perspectives.phx.nz/p/estimates</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Sun, 22 Jun 2025 21:27:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a80859c6-7ef4-4dc3-9154-e980e18bd1a8_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Developers hate estimates, yet we keep getting asked to create them. This isn't a paradox; it just means we don't understand the tremendous value that they can create.</p><p>I think this is because of two fundamental misunderstandings that we have about estimates:</p><ol><li><p>That the most important information in an estimate is the number of hours it will take to build something.</p></li><li><p>That estimates are an artefact that we toss over the wall to stakeholders so they can approve project budgets.</p></li></ol><p>If you want to turn estimation into a practice that will create value not just for your stakeholders but also for your development team, you'll need to confront these ideas and turn them on their heads.</p><h1>1. Estimates quantify risk, not effort</h1><p>Stakeholders aren't na&#239;ve. They understand just as well as developers that every number in an estimate is held up by a rickety scaffolding of unknowns, assumptions, and contingencies.</p><p>Where we run into trouble is we hide away those unknowns, assumptions, and contingencies and try to pretend as though they don't exist &#8212; and then stakeholders take us at our word.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>It's time to break the chain. <strong>When you're estimating, take all of those assumptions and risks that could potentially cause that number to change, and write them down along with the estimate.</strong></p><ul><li><p>Are there any requirements that are unclear or likely to change? Note them down.</p></li><li><p>Any dependencies or integrations that might not be compatible? List them.</p></li><li><p>Will you need to touch the legacy codebase that falls over every time someone so much as gives it a quizzical look? Don't keep it to yourself.</p></li><li><p>And so on.</p></li></ul><p>Once you start doing this, you'll notice two things:</p><ol><li><p><strong>It will become obvious just by looking which are the riskiest parts of the project.</strong> The deliverables with the most (or scariest) assumptions backing them will stand out as the most risky.</p></li><li><p><strong>You'll start spotting opportunities where the organisation could potentially invest in reducing some of that risk.</strong> Many unknowns can be explored, assumptions validated, and risks avoided simply by spending a few hours on additional discovery work.</p></li></ol><p>On their own, these are two extremely important insights that your estimates can create for you. But if you want to unlock the true value of an estimate, you need to understand that...</p><h1>2. Estimates are the start of a conversation, not the end of one</h1><p>Developers often make the mistake of thinking of an estimate as a deliverable: stakeholders are asking us a question, and we give them an answer. Job done.</p><p>Then we go off and do the <em>real</em> (i.e. development) work, and no-one ever speaks of that estimate again...that is, until towards the end of the project when the stakeholders pull it up again and demand to know why we're so far off.</p><p>We need to squash the mode of thinking that estimates are something that developers create <em>for</em> stakeholders. <strong>An estimate isn't a deliverable &#8212; it's a framework for having constructive conversations about risk.</strong></p><p>When you bring forward your perspective of where the most risk exists in the project, and stakeholders bring their perspective of where the most value can be created<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, it facilitates making key decisions such as:</p><ul><li><p><strong>Valuable but risky deliverables where it makes sense to invest in some additional discovery to de-risk them</strong></p></li><li><p><strong>Risky and not-valuable deliverables that we should drop from the project entirely</strong></p></li><li><p><strong>Estimates with low certainty/confidence where it's worth spending additional discovery hours to map out some of the unknowns</strong><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p></li><li><p>And so on.</p></li></ul><p>Once you start having these conversations and making strategic decisions with stakeholders, you'll notice that you're more reliably avoiding major issues and changes that used to cause your projects to completely blow out their estimates. You'll stop getting pulled into obnoxious "please explain" meetings...and who knows, you may even find that your estimates start getting more accurate.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Oh, they may raise an eyebrow during the planning phase of the project, but that's as much goodwill as you're going to get. By the end when the project has way overshot its budget and timelines, you can be sure then that you're not going to get the benefit of the doubt.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Engineering also has an important perspective on where the value creation potential exists, especially where it reduces system complexity and enables future initiatives. For simplicity I've omitted that here, but you can imagine just how multi-faceted these conversations about risk and value can get.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>By the way, this is a really good way to resolve those pesky "how long is a piece of string" estimation challenges.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Introvert networking]]></title><description><![CDATA[Unfortunately for us introverts, talking to people is still the best way to advance one's career. But that doesn't mean that you can't be a successful networker if you're introverted &#8212; you just have to stop playing by the extroverts' rules.]]></description><link>https://perspectives.phx.nz/p/introvert-networking</link><guid isPermaLink="false">https://perspectives.phx.nz/p/introvert-networking</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Mon, 18 Sep 2023 23:01:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/93260c6a-fb9f-4336-a1b2-b53c1ad76e6b_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I started my software engineering career in the early 2000s, a glorious time when developers had much in common with Harry Potter: we were shuttered away in cupboards, kept away from polite company, and everyone suspected that we were secretly dabbling in the arcane arts.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>Times have very much changed, but one thing that has remained resolute is the fact that many software developers &#8211; myself included &#8211; chose that line of work because we enjoy talking to computers rather more than talking to humans.</p><p>Unfortunately for us, talking to humans is still the best way to advance your career<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, and that leaves us introverts in a bit of a pickle.</p><p>The good news is, introvert networking is a thing. You can absolutely be a successful networker even if you don&#8217;t like crowds, despise small talk, or hate the taste of coffee.</p><p>You just have to stop playing by the extroverts&#8217; rules.</p><p>In this post, we&#8217;re going to explore three ways that you can build and maintain your network as an introvert:</p><ul><li><p><strong>Focus on what you can learn, not what you can get.</strong></p></li><li><p><strong>Mentors? Hard to find. People who know stuff? Those are everywhere.</strong></p></li><li><p><strong>More frequent contact is better than more contacts.</strong></p></li></ul><h1>Networking gets you access to perspectives, not opportunities</h1><p>We&#8217;re used to thinking of networking as a tricksy way to bypass gatekeepers: build strategic relationships, so that one day when you need a job, they&#8217;ll sneak your CV onto the top of the pile.</p><p>And if this makes networking feel transactional, insincere, and manipulative to you&#8230;that&#8217;s a good thing. Hold onto that feeling &#8212; it means you&#8217;re human.</p><p>But if that&#8217;s all that you think networking is good for&#8230;well then, you my friend are missing out, big time:</p><ul><li><p>How do I keep up with the latest trends and tech in my industry?<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> Easy: I chat to the people in my network.</p></li><li><p>How do I learn new approaches to solve technical and leadership challenges? I talk to my network.</p></li><li><p>What do I do when I&#8217;m stuck on a problem and need a sounding board to bounce ideas off of? Network.</p></li><li><p>What if I need advice or recommendations? Say it with me now&#8230;</p></li></ul><p>Sure, from time to time my network might toss an opportunity or two my way, but that&#8217;s just the cherry on top of an alpaca-sized cupcake of insights and learnings that I&#8217;ve leveraged to advance my career on my own terms.</p><p>This changes the game completely because <strong>if there&#8217;s one thing we introverts absolutely love to do, it&#8217;s having deep conversations with people about stuff that actually matters.</strong></p><p>With this in mind, let&#8217;s look at how you can optimise your network to get access to <strong>all</strong> the perspectives.</p><h2>Focus on what you can learn, not what you can get.</h2><p>During your first few months in a new job, you are a bit of a superstar because you bring a wealth of ideas and solutions that you learned about in previous roles. But after awhile that stockpile runs out, and your productivity begins its painful reversion to the mean.</p><p>Except&#8230;what if you could keep replenishing that supply without having to change jobs every few months?</p><p><strong>This is why it&#8217;s so valuable to network with people who will introduce you to a diversity of ideas.</strong> When thinking about whom to reach out to, focus on what you can learn, not what you can get.</p><p>Don't worry about their role, or whether they might be able to hire you, or even whether they know someone who could hire you. In fact, try networking with some people in entirely different fields and industries than you. You will be surprised at how many unique insights you can glean from their experiences that you can apply in your own work!<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a></p><h2>Mentors? Hard to find. People who know stuff? Those are everywhere.</h2><p>The best and worst advice I ever received about career development is: get a mentor.</p><p>It&#8217;s amazing advice because if you can find someone at the top of their field who&#8217;s willing to take you under their wing, teach you all the secrets, and help you avoid all the pitfalls&#8230;that&#8217;s like winning the career lottery.</p><p>And it&#8217;s terrible advice because you&#8217;re about as likely to find someone like that as you are to win the actual lottery.  People are really busy, and unless you already have an amazing relationship with a potential mentor, it's unlikely that they&#8217;ll be willing to commit to a long-term investment of time and effort. Nothing personal.</p><p><strong>But you know what's really easy to find? People who know stuff about specific topics and love to talk about them.</strong> By approaching the interaction as a one-off chat about something that you&#8217;re both interested in, rather than the beginning of a long-term relationship, you&#8217;ll find that most people are actually quite enthusiastic to connect.</p><h2>More frequent contact is better than more contacts.</h2><p>Winning at networking doesn&#8217;t mean getting to Dunbar&#8217;s Number as quickly as possible. If you have 150 people in your network<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> but only talk to each of them once a year, you're not going to be able to build meaningful relationships.  And anyway, it&#8217;s <em>exhausting</em> to keep up with so many people! No wonder we introverts hate networking so much!</p><p>But what if we stopped treating networking like a numbers game? &#8220;More is better&#8221; only works for fungible things like Bitcoins, pok&#233;mon, and romantic comedies<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>. When it comes to people, more frequent contact is way better than more contacts.</p><p><strong>Focus on quality, and the quantity will take care of itself.</strong> Just find people you enjoy talking to so much that after each chat, you feel like you literally can&#8217;t wait until the next one.  Do that, and you&#8217;ll never be short of interesting perspectives!</p><h1>Above all, be kind to yourself.</h1><p>Every person is different, and so every relationship is different&#8230;and that means that the best way to network will be different for each person.</p><p>Don&#8217;t worry about whether you&#8217;re &#8220;doing it right&#8221; &#8212;&nbsp;if what you&#8217;re doing is working and you enjoy doing it, then that is the right way to do it. <strong>Sustainable networking is successful networking.</strong></p><p>I have a lot more to say on the subject of introvert networking, so there will definitely be more posts about this in the future. In the meantime, if you have thoughts about this or want to chat, get in touch! Just don&#8217;t take it personally if it takes me awhile to reply &#8212; I&#8217;m pretty introverted.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I was a level 9 half-elf wizard in Dungeons &amp; Dragons, so in my case their suspicions weren&#8217;t entirely unfounded.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>At least until AI finally overthrows human civilisation, at which point we introverts will be inducted into the priest caste, second only to our robot overlords in wealth and influence.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>You know, that question you keep getting asked in job interviews.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Seriously. If you&#8217;re a software developer, try having chats with product managers. The stuff you learn from them will blow your mind. And if you&#8217;re a product manager&#8230;thank you for your service.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>I mean your <em>real</em> network, not your LinkedIn connections&#8230;but more on that another time.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>Also a convertible made entirely of mushrooms. A fungible, if you will. I&#8217;ll see myself out now.</p></div></div>]]></content:encoded></item><item><title><![CDATA[The two-year rule]]></title><description><![CDATA[Junior developers are not fated to leave your organisation within two years. There are a few simple steps you can take to ensure that their learning and career progression never stops, and that their skills are developing in accordance with the needs of your team and the organisation.]]></description><link>https://perspectives.phx.nz/p/the-two-year-rule</link><guid isPermaLink="false">https://perspectives.phx.nz/p/the-two-year-rule</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Tue, 29 Aug 2023 01:14:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0202fe9c-f833-483f-aaed-b945730565aa_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Junior developers on average have a reputation for leaving their first role after about two years, and this reputation is&#8230;somewhat unfair.</p><p>There is a kernel of truth to it: the digital tech industry is crowded at the bottom, and landing that first role is so important that it&#8217;s usually worth it to take an &#8220;accept first, ask questions later&#8221; approach to job offers.</p><p>However&#8230;.</p><p>I mentor many software engineers throughout their careers, and when I talk to junior and intermediate developers who are thinking of moving on from their first employer, far and away the two most common reasons they cite are:</p><ul><li><p>Their learning has plateaued.</p></li><li><p>Their career progression is unclear or stalled.</p></li></ul><p>In third place, we have values misalignment and culture conflicts &#8211; i.e., they had to take what they could get for their first role &#8211;&nbsp;but it&#8217;s almost always accompanied by one of the above two points.</p><p>This is good news because it means that if your junior developers aren&#8217;t sticking around, it is absolutely within your power to fix this problem.</p><p>In this post, we&#8217;re going to tackle this problem from three angles:</p><ul><li><p><strong>Start with a learning plan</strong> for each developer that balances their interests, your goals for them, and the organisation&#8217;s needs.</p></li><li><p><strong>Take notes and look for trends</strong>, so that you can provide strategic guidance, not just tactical feedback.</p></li><li><p><strong>Continually adapt as reality asserts itself</strong>, so that the developer always has high-level goals to work toward.</p></li></ul><h1>Mentoring junior developers means creating structure</h1><p>Junior developers are every bit as good at (and as hungry for) learning and growth as their more senior teammates. However, because they are so new to their discipline, they don&#8217;t yet have sufficient context to plan out their learning over the medium-to-long-term.  Without guidance, they will soon run out of low-hanging fruit&#8230;and that&#8217;s when they start looking around for juicier opportunities at other organisations.</p><p>This is where you come in. You can provide that structure and direction for their learning, so that they are continually growing, they are aware of the progress they are making, and most importantly, they can see even more challenges and opportunities waiting in their future.</p><h2>Start with a learning plan</h2><p>To kick things off, during your next one-to-one with each of your junior developers, design the first iteration of their learning plan by discussing and balancing these three factors:</p><ul><li><p><strong>What do they want to learn?</strong> Even if they might not initially have a strong understanding of what they want to learn, it will help you get a general idea of where their interests lie, and it will plant the seed that managing their professional development is a shared responsibility.</p></li><li><p><strong>What do you want them to learn?</strong> This will be based on how you want their career progression to go. It could involve mapping a path towards intermediate status, or it might include specialisations such as devops, cybersecurity, test automation, etc.</p></li><li><p><strong>What do the team and the organisation need them to learn?</strong> This will be based on the tech stack, cross-functionality gaps, upcoming migrations, etc.</p></li></ul><p>You&#8217;ve likely clocked that all of this changes over time, so don&#8217;t worry about getting the learning plan perfect at this point. Just focus on putting together a first iteration that feels about right, knowing that you&#8217;ll be adapting it as the developer makes progress and as circumstances change.</p><h2>Take notes and look for trends</h2><p>For most managers and mentors, supporting a junior developer in achieving their learning goals takes the form of weekly or fortnightly one-to-one meetings, sometimes accompanied by pair programming and code review.</p><p>These are excellent <strong>tactical</strong> tools. Checking in week-to-week gives you opportunities to make observations and provide immediate feedback, but these need to be supplemented with a month-to-month view, so that you can also give the developer <strong>strategic</strong> guidance.</p><p>How is the developer tracking overall? Are there specific challenges or concepts that they tend to struggle with? Are they gaining momentum, or are they getting stuck? Are they still on-track, or do they need to pivot?</p><p>To answer these questions, you need to be able to retain and compare your observations over many weeks and months. For a busy manager with an entire team to look after, this is simply too much information to keep mental track of.</p><p>Which is why you should absolutely delegate that task to a notepad or digital file:</p><ul><li><p>During each mentoring session with a developer (one-to-one, pair programming, etc.), keep a physical or digital notepad handy, and take high-level notes about their progress, habits, and obstacles.</p></li><li><p>Once a month, take a moment before each one-to-one to go back over the past month or two of notes for that developer, and look for trends.  Use your discoveries to inform the agenda for the one-to-one meeting.</p></li></ul><p>Your developers will notice and begin to anticipate these monthly &#8220;strategic one-to-ones&#8221;, and they will quickly become the most valuable conversations you have with them.</p><h2>Continually adapt as reality asserts itself</h2><p>Just like software, learning plans are never finished.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> During your monthly strategic one-to-ones with each developer, revisit the learning plan, recognise their progress, and see if a new iteration is needed. This helps you ensure they always have high-level goals that they&#8217;re working towards.</p><p>Remember that an effective learning plan strikes the right balance between:</p><ul><li><p>What the developer wants to learn.</p></li><li><p>What you want them to learn.</p></li><li><p>What the team and organisation need them to learn.</p></li></ul><p>And don&#8217;t forget that <a href="https://perspectives.phx.nz/p/cross-contamination">keeping track of things is just as important a skill for you as it is for your developers.</a>  Make sure that you&#8217;re taking notes and looking for trends so that you can provide strategic guidance, not just tactical feedback.</p><p>Before you know it, you&#8217;ll have a hard time keeping junior developers&#8230;because you&#8217;ll be regularly promoting them into intermediate developers!</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>And they always have bugs.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The blame game: retrospective anti-patterns]]></title><description><![CDATA[We all know that we&#8217;re not supposed to blame individuals during retrospectives, but&#8230;you know&#8230;sometimes when bad things happen there&#8217;s clearly someone at fault, right? How to keep retrospectives from descending into the blame game?]]></description><link>https://perspectives.phx.nz/p/retro-anti-patterns-blame-game</link><guid isPermaLink="false">https://perspectives.phx.nz/p/retro-anti-patterns-blame-game</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Mon, 07 Aug 2023 23:00:04 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" 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://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="5472" height="3648" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3648,&quot;width&quot;:5472,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;black and white short coated small dog on gray concrete floor&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="black and white short coated small dog on gray concrete floor" title="black and white short coated small dog on gray concrete floor" srcset="https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1599443134706-e67758159cdc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxjb25lJTIwb2YlMjBzaGFtZXxlbnwwfHx8fDE2OTA0OTk4ODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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/@priscilladupreez">Priscilla Du Preez</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>We all know that we&#8217;re not <em>supposed</em> to blame individuals during retrospectives, but&#8230;you know&#8230;sometimes when bad things happen there&#8217;s clearly someone at fault, right?</p><p>Maybe a team member bypassed code review to merge in a controversial change, which ended up causing downtime and a hasty rollback.</p><p>Or perhaps someone rushed through a schema migration, resulting in a late night spent restoring corrupted data.</p><p>Or maybe a team member got stuck on a problem and spent half the sprint at the bottom of a rabbit hole instead of asking for help, until it was too late and the team missed their sprint goal. And so on.</p><p>Whatever the cause, the result is always the same: as soon as the topic comes up during the retrospective, everyone&#8217;s head swivels simultaneously to stare down the instigator of the team&#8217;s misery.</p><p>How do you keep things on-track, avoid personal attacks and defensiveness, and most importantly, how do you ensure your team comes out of the session with an actionable plan to improve things together?</p><h1>The perfect blend: one part collective (team) ownership, two parts curiosity</h1><p>The key to winning The Blame Game is for your team to take collective ownership of the problem, and to be curious about the perspectives and circumstances surrounding the incident.</p><p>There are many different ways you can facilitate this during your team&#8217;s retrospectives.  Below are a few examples of approaches that I&#8217;ve used.</p><h2>There are no people problems, only process problems</h2><p>No-one is the villain of their own story. Sure, maybe someone made a mistake that negatively impacted the team, but in the moment they genuinely thought they were doing the right thing. They were just missing a key piece of information or a critical step in the process that would have helped them to make a different decision.</p><p>Shift the focus of discussion away from the person and towards identifying what that missing piece could be:</p><ul><li><p>&#8220;Where did our process fail? How can we make it more robust without slowing us down?&#8221;</p></li><li><p>&#8220;What knowledge could have helped us to make different decisions? How do we make that information more accessible?&#8221;</p></li></ul><h2>Software development is a team sport</h2><p>A high-performing team doesn&#8217;t require every member to be a superhero. Rather, a high-performing team has learned how to work together to create something that is greater than the sum of its parts.  When a member of the team makes a mistake, the team must collectively own that mistake, so that they can learn how to be even more effective together in the future.</p><p>Try nudging the conversation towards fostering more collaborative ways of working:</p><ul><li><p>&#8220;As a team, how can we support each other better, so that no-one ends up in that situation again?&#8221;</p></li><li><p>&#8220;What would have been a better outcome, and how could we have worked together to help bring that about?&#8221;</p></li></ul><h2>If you have a team charter or working agreement, this is a chance to reaffirm (or revise) your team&#8217;s ways of working</h2><p>Many teams have a team charter or working agreement&#8230;filed away somewhere in the company intranet, untouched and un-viewed since the day it was created.</p><p>Retrospectives are a great way to keep this part of your team culture relevant:</p><ul><li><p>&#8220;This sounds similar to something we talked about when we last iterated on our team charter. Did we miss an opportunity here to help each other to stay true to our shared values?&#8221;</p></li><li><p>&#8220;I don&#8217;t think anything like this came up during our last working agreement session. Maybe this is an opportunity to schedule some time to draft the next iteration?&#8221;</p></li></ul><p>Avoid the temptation to make amendments to the team charter or working agreement during the retrospective.  These sessions require a different mindset, and you don&#8217;t want recent events to bias the outcome.  Instead agree to scheduling a session to work on the team charter and then move on to the next topic.</p><h1>Keep cultivating curiosity and co-operation</h1><p>The common through-line for resolving team conflicts during retrospectives is collective ownership and curiosity.</p><p>As the team manager, in rare cases you may have to step in to address performance or certain interpersonal issues. The remaining 99% of the time, however, you&#8217;ll affect more lasting positive change by:</p><ul><li><p>Helping your team members accept collective (team) ownership of each problem, and</p></li><li><p>Facilitating curiosity to explore different perspectives of problems and potential solutions.</p></li></ul><p>Remember: <a href="https://perspectives.phx.nz/p/retro-anti-patterns-group-therapy-session">retrospectives are about the future, not the past.</a></p><p>In the meantime, we&#8217;re not yet done with retrospective anti-patterns! I&#8217;ll be back in a few weeks to explore The Shouting Match and how to make sure everyone on your team has an opportunity to make their voice heard.</p>]]></content:encoded></item><item><title><![CDATA[Siren songs]]></title><description><![CDATA[If you want to get positive ROI from your junior developers within 18-24 months, teach them skills. If you want to do it within 3 months or less, teach them habits.]]></description><link>https://perspectives.phx.nz/p/siren-songs</link><guid isPermaLink="false">https://perspectives.phx.nz/p/siren-songs</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Tue, 18 Jul 2023 00:16:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you want to get junior developers up-to-speed within 18-24 months, teach them skills.</p><p>If you want to do it within 3 months or less, teach them habits to help them manage cognitive load.</p><p>Let&#8217;s look at a common source of conitive load that causes junior developers to get stuck: distractions.</p><p>The developer is in the middle of fixing a bug or implementing a feature, when they think, &#8220;Hmm, this code is kind of hacky; I should refactor it to make it cleaner.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>&#8221; So they switch into refactoring mode and start rewriting, but then they bump into an unfinished part and have to switch back into solutioning mode.</p><p>This goes back and forth a few times, with the developer continually context-switching between refactoring and solutioning.  Before long, they have a Frankenstein&#8217;s monster of half-implemented ideas, everything grinds to a halt, and the developer is well and truly stuck.</p><p>Our hypothetical developer isn&#8217;t lacking a technical skill. There isn&#8217;t a principle or pattern they can be taught to help them avoid this situation &#8212; they may even be able to cite solid reasons<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> why the refactor is necessary.</p><p>The real issue is that the refactor is a distraction, and the developer hasn&#8217;t yet learned how to manage these distractions.</p><p>Unfortunately, the advice most developers receive about managing distractions is, &#8220;ignore them&#8221;, but this won&#8217;t work either.</p><h2>Distractions are like kittens: they won&#8217;t tolerate being ignored for long</h2><p>The trick (and where the metaphor hopefully breaks down) is to have a system for funnelling them into a holding area, so that you can deal with them later.</p><p>Here are some ways I teach junior developers good habits for wrangling all those fusspot distractions.</p><h2>Ugly code that works first, then pretty code that works</h2><p>New developers don&#8217;t understand the difference between coding and refactoring &#8212; and critically, they don&#8217;t understand that there&#8217;s a context switch that occurs when flipping between the two. During pair programming, help them identify when they unconsciously switch from coding mode to refactoring mode, and then to switch back before they lose focus on their original goal.</p><h2>Construct a parking lot</h2><p>As developers work, they will naturally identify issues and inefficiencies in the surrounding code. This is a good thing &#8212; it&#8217;s how a lot of teams discover the majority of their technical debt, after all. So, you don&#8217;t want your developers to disregard these discoveries, but you also want them to avoid getting diverted into rabbit holes.</p><p>To strike that balance, work with each developer to design and create their own parking lot. When they discover an issue in the code that would potentially distract them, they can stuff it into their parking lot, to be dealt with once they&#8217;ve freed up some headspace.</p><p>Experiment to find the system that works best for each developer. Some examples that I&#8217;ve found work well include:</p><ul><li><p>A separate text file, Notion page, etc.</p></li><li><p>Adding stub cards to the product backlog.</p></li><li><p>Adding warning comments (<code>TODO</code>, <code>FIXME</code>, etc.) to the code where issues are found.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p></li><li><p>Writing in a physical notebook or on sticky notes.</p></li></ul><p>We&#8217;ll go over how to follow-up on the items in the parking lot in a moment, but first&#8230;.</p><h2>Commit after every win</h2><p>Once the developer has a working solution &#8211;&nbsp;no matter how ugly &#8211; get them in the habit of committing their changes before attempting any refactoring.</p><p>This is useful for avoiding <a href="https://perspectives.phx.nz/p/cross-contamination">cross-contamination</a>, but it&#8217;s also important for keeping that cognitive load at a manageable level. Until the changes are committed, the developer has to maintain a &#8220;mental snapshot&#8221; of their work, so that they can undo further changes in case they break something during their refactoring.</p><p>With practice, developers can build up their capacity to maintain these mental snapshots (to an extent), but especially for new developers it can be extremely taxing. Teach them instead to &#8220;page out to git&#8221;, so that they can free up mental RAM for the next operation.</p><h2>Getting back to that parking lot&#8230;</h2><p>After solving the original problem and committing changes to version control, the developer is now ready to go back and follow up on the issues they stuffed into their parking lot.</p><p>Some of the issues will be small or straightforward enough that they can be addressed right away (don&#8217;t forget to commit after every win!). Others will need to be added to the product backlog as technical debt.</p><h2>Keep moving forward</h2><p>In my experience, the biggest factor keeping junior developers from being productive is rarely lack of technical knowledge. Rather, where they tend to run into trouble is not having built up habits to manage cognitive load and free up that mental capacity to apply to technical challenges.</p><p>Teach your developers good habits for recognising and managing distractions, and leveraging git as virtual mental RAM, and you&#8217;ll start seeing their productivity gains compound.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>&#8220;I bet I can apply (read: force in) this design pattern I just learned about!&#8221;</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Or perhaps SOLID reasons.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>If you go this route, be sure to turn on <a href="https://eslint.org/docs/latest/rules/no-warning-comments">no-warning-comments</a>, <a href="https://pylint.pycqa.org/en/latest/user_guide/messages/warning/fixme.html">fixmes</a>, etc. in your linter, to ensure these comments get cleaned up later.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Cross-contamination]]></title><description><![CDATA[Having worked with students and junior developers for the better part of a decade now, I find myself fascinated by just how much developers depend on their ability to keep track of things&#8230;and how often this skill is taken for granted.]]></description><link>https://perspectives.phx.nz/p/cross-contamination</link><guid isPermaLink="false">https://perspectives.phx.nz/p/cross-contamination</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Mon, 26 Jun 2023 23:40:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Having worked with students and junior developers for the better part of a decade now, I find myself fascinated by just how much developers depend on their ability to keep track of things&#8230;and how often this skill is taken for granted.</p><p>It&#8217;s not the most important skill software engineers can have overall<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, but I think it is easily the most important factor that determines how quickly a junior developer can get up-to-speed.</p><p>Here&#8217;s what it looks like when a developer is struggling to keep track of things:</p><p>The developer is working to fix an error or get some functionality to work. They try one approach and don&#8217;t get the result they expected, so they back out their changes to try something else &#8212; but they forgot some of the files they touched and end up only removing part of the attempted solution.</p><p>They try again with a different approach that <em>would</em> have worked, but instead it fails because of the changes they forgot to revert from the first attempt. However, the developer doesn&#8217;t realise this, and so they [partially] back out their changes to try something else.</p><p>After a few iterations, the developer has cross-contaminated the codebase with overlapping partially-implemented solutions. The app is now showing the white screen of death, and the developer is well and truly stuck.</p><h1>Preventing cross-contamination</h1><p>Cross-contamination is easy to catch during pair programming as long as the navigator is paying attention, and you can sometimes find artefacts of it during code review as well. However, <strong>the surest way to fix the problem is to coach the developer to build good habits, so that they can avoid it in the first place:</strong></p><h2>Check working copy status regularly</h2><p>Each time they back out their changes to try a different approach, ask the developer to do a quick <code>git status</code> to make sure they caught everything. By regularly comparing their recollection of everything they touched against the actual state of their working copy, the developer will build that mental muscle.</p><h2>Debugging statements need to get backed out, too</h2><p>For better or for worse, developers (of all skill levels) tend to do most of their debugging by adding statements to print out values of variables and expressions&#8230;and they almost always forget to remove those statements later.</p><p>After a few iterations, the console gets polluted with lots of no-longer-relevant information, further increasing cognitive load and making it that much harder to keep track of things. Get the developer in the habit of removing debugging statements as soon as they are no longer needed.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><p>Teaching the developer how to use their IDE&#8217;s debugger is also super helpful in the long run, but choose your moment carefully &#8212; it takes significant mental effort and a context switch to learn a new tool.</p><h2>Diff the code before committing</h2><p>Every time a developer types <code>git add . &amp;&amp; git commit</code> into their console, there is a fairy somewhere that falls down dead.</p><p>Before creating a new commit, encourage the developer to run <code>git diff --cached</code> and go over the changes they are about to commit. Reviewing the change set as a whole puts the developer in a different mindset to help them catch issues that they overlooked during coding, and it is another way to build that mental muscle by checking how well they remember the changes they made.</p><h2>Teach them to love tiny commits</h2><p>Expert rock climbers can scale sheer cliffs without a safety rope. In order to survive long enough to become expert rock climbers, novices must learn to hammer pitons into the cliff face periodically and attach their safety rope, so that they won&#8217;t lose too much progress (amongst other things) if they fall.</p><p>Software developers can do the same thing with code commits: <strong>as soon as the developer makes incremental progress towards solving a problem (and has passing tests to prove it), get them to make a commit.</strong> This helps to keep cognitive load manageable, and it acts as a piton for the developer&#8217;s progress &#8212;&nbsp;they can feel confident to make even radical changes to the code without risking losing their progress towards the overall solution.</p><p>Just as in cooking, the key to preventing cross-contamination is to build healthy habits. Coach your junior developers to manage cognitive load and build their capacity to keep track of the changes they make to the code, and it won&#8217;t take long before they develop the confidence and independence that they need to start their journey to intermediate status.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Empathy gets that title, and I&#8217;ll for sure be exploring that in a future post.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>And while you&#8217;re in there, why not configure the linter to treat debugging statements as linting errors?</p></div></div>]]></content:encoded></item><item><title><![CDATA[Praising with faint damnation]]></title><description><![CDATA[It seems that the humble code review evolved when nobody was looking &#8212; and now we&#8217;re all struggling to catch up, whether we realise it or not. Thanks to advances in the field of devops, automation has created an opportunity to turn code review into a multiplier for your team members' learning and productivity.&#160; Don't waste that opportunity!]]></description><link>https://perspectives.phx.nz/p/praising-with-faint-damnation</link><guid isPermaLink="false">https://perspectives.phx.nz/p/praising-with-faint-damnation</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Mon, 05 Jun 2023 19:01:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It seems that the humble code review evolved when nobody was looking &#8212; and now we&#8217;re all struggling to catch up, whether we realise it or not.</p><p>At one point code review served as an important stage-gate to prevent bugs, security vulnerabilities, and other code quality issues from getting into production (with debatable degrees of success, but let&#8217;s not get into that here).</p><p>However, now that we&#8217;re in the golden age of devops, your CI pipeline should be catching the vast, <strong>vast</strong> majority of quality and security problems, long before your pull requests get to the review stage.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> <strong>As a result, it should be very rare that code review uncovers a problem severe enough that it should prevent the branch from getting merged.</strong></p><p>To stay relevant, code review has evolved into a practice for facilitating cross-training and upskilling within your team. It gives your team members a chance to familiarise themselves with what&#8217;s happening in other parts of the codebase, and it can be an exceptionally effective way for your senior developers to teach and reinforce software design concepts for your junior and intermediate developers.</p><p>But most developers haven&#8217;t caught on to this just yet. Far more often than not, developers still approach code reviews with the mindset of hunting for problems. <strong>As a result the most positive review a developer can hope for is an absence of comments pointing out any major problems with their code, and only a few quibbles on minor points of style or practice &#8212; effectively praising with faint damnation.</strong></p><p>It doesn&#8217;t have to be this way! Here are some ideas you can communicate to your senior developers to get them out of this trap and start getting real value out of code reviews:</p><ul><li><p><strong>Since they aren&#8217;t yet familiar with software design concepts, junior (and intermediate) developers can sometimes luck into writing something the right way without realising it.</strong> Calling out correct usage of design patterns and adherence to software design principles in the code review (and explicitly naming the principle or pattern!) can be a <strong>huge</strong> boost for that developer&#8217;s learning.</p></li><li><p><strong>This is also a great way to reinforce concepts that you are currently coaching the developer on.</strong> Comment on instances where you see them applying those learnings correctly, so that they have concrete examples to help them better understand the technique and recognise the progress that they are making. As a bonus, the event will be cemented in their mind, so you can bring it up in your next one-to-one with them to build a bridge to the next concept you want them to learn.</p></li><li><p><strong>Because they don&#8217;t (yet) have years of experience doing things a particular way, junior developers are often ridiculously good at discovering libraries, features, and techniques that their more senior teammates didn&#8217;t know about.</strong> Seeing a simple, &#8220;I didn&#8217;t know we could do that! Great find!&#8221; in their code review comments is highly motivating for a junior developer (or of any skill level, really) and it will help bolster their confidence and independence.</p></li><li><p><strong>It makes junior developers less intimidated to review (and learn from!) their teammates&#8217; code.</strong> Junior developers struggle continually with imposter syndrome, and this makes them very hesitant to review code written by other developers&#8230;especially when they think that the job of the reviewer is to identify problems with the code! But when your junior developers see their teammates praising good practices and calling out learnings in code review, it shows them that their perspectives are also valuable, and they&#8217;ll be more encouraged to participate.</p></li><li><p><strong>Praising well-designed code helps solve the &#8220;tone problem&#8221; of code reviews.</strong> An overwhelming majority of code review is conducted asynchronously, usually by leaving typed comments on a pull request, and we all know how easy it is to read a negative tone into written messages, intended or not. By encouraging a practice of calling out the good stuff during code review, it cultivates a more positive mindset for both the code author and the reviewer, leading to less conflict and more productive discussions.</p></li></ul><p>Thanks to advances in the field of devops, automation has created the space for your developers to engage in more thoughtful and positive discussions during code review.</p><p>Don&#8217;t fall into the trap of praising with faint damnation. Praise with genuine praise, and your code reviews will become catalysts for multiplying your team members&#8217; learning and productivity.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>A <strong>very</strong> incomplete list of CI code scanning tools includes <a href="https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning">CodeQL</a>, <a href="https://docs.github.com/en/code-security/dependabot">Dependabot</a>, <a href="https://semgrep.dev/">Semgrep</a>, <a href="https://snyk.io/">Snyk</a>, <a href="https://github.com/hadolint/hadolint">hadolint</a>, <a href="https://www.checkov.io/">checkov</a>, <a href="https://aquasecurity.github.io/tfsec/latest/">tfsec</a>, <a href="https://trufflesecurity.com/trufflehog/">TruffleHog</a>, plus the dozens of linter, formatter, and test automation tools that exist for every programming language. Setting up each of these tools is generally pretty straightforward, and they make for great &#8220;low-hanging fruit&#8221; devops tasks if you&#8217;re looking to cultivate a cross-functional team (hint, hint).</p><p>Also, if you know of any tools that I should add to this list, I&#8217;d love to learn about them! Get in touch &#128570;</p></div></div>]]></content:encoded></item><item><title><![CDATA[Slow is smooth, and smooth is fast]]></title><description><![CDATA[When I was first learning how to ride a motorcycle, I was so nervous about stalling the bike that I would try to execute gear changes as quickly as possible.]]></description><link>https://perspectives.phx.nz/p/slow-is-smooth-and-smooth-is-fast</link><guid isPermaLink="false">https://perspectives.phx.nz/p/slow-is-smooth-and-smooth-is-fast</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Mon, 15 May 2023 22:36:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-MF1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6d155bf-68f3-4cfa-ab0a-8695457b15a0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I was first learning how to ride a motorcycle, I was so nervous about stalling the bike that I would try to execute gear changes as quickly as possible. The result was that I would cause the transmission to make the most horrifying sounds&#8230;and then stall.</p><p>Worse still, I found that it was impossible for me to improve on my own. Every gear change was such a frantic scramble to pull and push every lever I could find (and hope that I did it in the right order), that I could barely keep track of my movements, let alone inspect and improve my technique!</p><p>My instructor &#8211; with the patience of a thousand saints &#8211; helped me overcome this problem by drilling a mantra into my head: <strong>Slow is smooth, and smooth is fast.</strong> By making slower, more deliberate movements with the controls, I was able to feel the bike respond, which then allowed me to adapt my technique and execute gear changes smoothly. And even though at first I had to go painfully slowly in order to get it right, I got faster and faster with practice&#8230;until one day I was shifting gears even faster than my original frantic scramble, and with far fewer complaints from the transmission.</p><p>The same principle applies to writing software, especially when you&#8217;re first starting out.</p><p><strong>Junior developers feel tremendous pressure to solve problems quickly.</strong> They have heaps of imposter syndrome to overcome, they are worried about being a burden on their teammates, plus there&#8217;s a natural pressure that everyone feels to &#8220;prove themselves&#8221; when they start a new role.</p><p>As a result, junior developers often get fixated on trying to get the desired result (i.e., the correct sequence of characters typed into the editor) as quickly as possible, and they avoid any activity that they perceive would slow them down (i.e., debugging).</p><p>I&#8217;ve seen it time and time again: The developer writes some code and tests it out, and they see that it doesn&#8217;t get the result they expected &#8212; but instead of stopping to figure out <strong>why</strong> it didn&#8217;t work, they instead dive straight back into their code to try something else. Unfortunately that something else doesn&#8217;t work either, and round and round they go. It doesn&#8217;t take long before the developer is completely out of ideas, and now they&#8217;re well and truly stalled.</p><p>Fortunately, it&#8217;s very easy to coach junior developers out of this. The key is to teach them how to make slower, more deliberate changes to the code, observing how the programme responds as a result, and adapting their approach in order to find the solution in fewer iterations:</p><ul><li><p><strong>Teach them where to set the breakpoints in their process.</strong> Pair program with them, and when you see them neglecting to analyse the results before diving back into the code, gently interrupt them and point them in the right direction. It shouldn&#8217;t take long before they pick up the habit themselves.</p></li><li><p><strong>Get them to internalise the Two Questions&#8482; when there&#8217;s an error message.</strong> When the code generates an error, ask the developer the two key questions:</p><ul><li><p>&#8220;What does it say is the problem?&#8221; &#8212; get them in the habit of reading and understanding the error message&#8230;and in particular, not ignoring the complicated-looking parts (I&#8217;m looking at you, TypeScript).</p></li><li><p>&#8220;Where does it say the problem is happening?&#8221; &#8212; get them in the habit of analysing the stack trace.</p></li></ul><p>It should only take a few iterations before the developer starts hearing the sound of you asking these questions in their head every time they see an error message. And also in their nightmares, but I&#8217;m told that goes away with time. Usually.</p></li><li><p><strong>Ask leading questions instead of giving answers.</strong> Pair programming often feels slower than working individually because many of its outcomes (cross-training, code quality, upskilling) are invisible and come at the cost of raw coding speed. When the junior developer gets stuck or overlooks something, you will be tempted to tell them what to do to get things back on track quickly &#8212; but this will only make them more dependent on you. Instead, challenge yourself to come up with leading questions that will foster their curiosity and help them to learn the way to the right solution themselves.</p></li><li><p><strong>Reinforce takeaways at the end of the session.</strong> Before you close out a pair programming session with a junior developer, take a moment to reinforce the learnings you want them to take away from the session. In particular, be sure to call out any progress that you&#8217;ve observed, not just suggestions for improvement!</p></li></ul><p>This process is going to feel uncomfortably slow at first, and especially during the first few pair programming sessions you might feel like you&#8217;re not making much progress in terms of the actual coding. That&#8217;s OK &#8212; the primary outcome you want here is for the junior developer to develop a more systematic approach to analysing and solving their own problems. Once they have that down, they&#8217;ll get faster and faster with practice.</p><p>Slow is smooth, and smooth is fast.</p>]]></content:encoded></item><item><title><![CDATA[The group therapy session: retrospective anti-patterns]]></title><description><![CDATA[&#8220;At regular intervals, the team reflects on how to become more effective.&#8221; Sound familiar?]]></description><link>https://perspectives.phx.nz/p/retro-anti-patterns-group-therapy-session</link><guid isPermaLink="false">https://perspectives.phx.nz/p/retro-anti-patterns-group-therapy-session</guid><dc:creator><![CDATA[Phoenix Zerin]]></dc:creator><pubDate>Fri, 05 May 2023 23:41:51 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" 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://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="1080" height="720" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;group of people near bonfire near trees during nighttime&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="group of people near bonfire near trees during nighttime" title="group of people near bonfire near trees during nighttime" srcset="https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1478131143081-80f7f84ca84d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwyfHxjYW1wZmlyZXxlbnwwfHx8fDE2ODMzMjk5NTg&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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/@tegan">Tegan Mierle</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>&#8220;At regular intervals, the team reflects on how to become more effective.&#8221; Sound familiar? This is one of the <a href="https://agilemanifesto.org/iso/en/principles.html">12 principles</a> from the Agile manifesto, and for most teams, this principle manifests as a regular retrospective meeting of some kind.</p><p>Except&#8230; I lied to you.</p><p>The principle actually states: &#8220;At regular intervals, the team reflects on how to become more effective, <strong>then tunes and adjusts its behaviour accordingly.</strong>&#8221; But, for many teams &#8211;&nbsp;especially when they&#8217;re new to running retrospectives &#8211; they tend to forget about that second part.</p><h1>Where teams go wrong</h1><p>Your team sits down for their regular retrospective session, and engagement is ridiculously high. Everyone shows up with plenty to talk about.  Your teammates celebrate their wins, appreciate one another, vent about things that didn&#8217;t go according to plan, and they may even propose a few ways they could do things better in the future.</p><p>And then the meeting ends, everyone goes back to work, and nothing really changes. There may be a few half-hearted attempts to implement some of the ideas that were discussed, and occasionally someone on your team captures an action item by accident. But by and large, team members walk away from each retrospective with maybe a bit of closure but mostly the feeling that they just wasted another hour on yet another pointless meeting.</p><h1>How to fix it</h1><p><strong>It may sound counter-intuitive, but retrospectives are not fundamentally about the past &#8212;&nbsp;they&#8217;re about the future.</strong> During retrospectives we discuss what happened in the past as a means to an end, not an end in itself. Talking about the past ensures shared understanding of the problems we want to solve, and it provides context for the solutions we want to try.</p><p>If your team struggles to get actionable outcomes from retrospectives, here are some things you can work on with them:</p><ul><li><p><strong>Dedicate space on the whiteboard to record action items, and nominate a facilitator to own that space and make sure it gets filled in.</strong> This makes the goal of the meeting highly visible to all participants, and it formalises accountability for making sure the discussion progresses towards that goal. The facilitator is also empowered to participate in discussions, so long as they prioritise their duty to record the outcomes of those discussions.</p></li><li><p><strong>Once your team members have started discussing a topic and everyone has a good understanding of where things are at, start guiding the discussion towards designing a plan of action.</strong> There will be some topics that your team members will have very strong feelings about that they want to express, and that&#8217;s great! By all means, let people spend a few minutes getting things off their chests&#8230; and then they need to start channelling that energy towards a productive outcome. If a discussion starts going in circles or seems to be devolving into a venting session, start prompting the participants to suggest ways the team can improve the situation.</p></li><li><p><strong>Carpark topics that aren&#8217;t yielding constructive discussion.</strong> There are some topics that are not appropriate for retrospectives. These may be problems that your team members aren&#8217;t ready to discuss potential solutions for yet, or that only affect a small minority of your team, or that originate from outside the team. If the facilitator is struggling to direct a conversation towards devising a plan of action, ask to carpark the issue and move on. Also, be sure to flag these items for later follow-up, as you may want to incorporate them into one-to-ones with your team members, discuss them with other team leads, etc.</p></li><li><p><strong>Treat process improvement tasks just like regular work tasks &#8212;&nbsp;track them on the board, bring them up during standups, reserve bandwidth for them during sprints, etc.</strong> That may be a contentious recommendation, but in my experience it&#8217;s the only way to reliably ensure that teams actually trial new ways of working. I&#8217;ve seen way too many teams put in all of that work to run productive retrospectives and capture action items&#8230; and then toss those action items into a process improvement backlog, where they are never seen again. Keep these tasks highly visible, and keep your team accountable for following through!</p></li></ul><p>Your team should now be getting regular actionable outcomes from its retrospectives, which will also boost engagement and improve cohesion within your team. This is a great start, and there are many ways you can gain more value from this practice.  I&#8217;ll be revisiting this topic from time to time &#8212; keep an eye out.</p>]]></content:encoded></item></channel></rss>