<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ben Balter</title><description>Engineering leadership, open source, and showing your work</description><link>https://ben.balter.com/</link><item><title>Reorgs happen</title><link>https://ben.balter.com/2026/06/07/reorgs-happen/</link><guid isPermaLink="true">https://ben.balter.com/2026/06/07/reorgs-happen/</guid><description>In thirteen years at GitHub I was part of 25 reorgs—almost one every six months. Reorgs are a constant in tech, not a crisis. Here&apos;s how to navigate them.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In thirteen years at GitHub, I was part of 25 reorgs and reported to 13 different managers. That’s a new org chart roughly every six months and a new boss roughly every year—like clockwork.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-clockwork&quot; id=&quot;user-content-fnref-clockwork&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I know these numbers because I tracked them. What started as a humble spreadsheet eventually metastasized—as my side projects tend to do—into a full statistical forecast model that predicted the date of my next reorg with confidence intervals.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-repo&quot; id=&quot;user-content-fnref-repo&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; When colleagues asked how I stayed so calm during shake-ups, the honest answer was that I’d seen the data: reorgs are a disruptive fact of life in tech, and they can be a major source of stress and uncertainty. But they don’t have to be.&lt;/p&gt;
&lt;h2 id=&quot;why-reorgs-happen&quot;&gt;Why reorgs happen&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#why-reorgs-happen&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most reorgs aren’t about you. They’re rarely malicious, and honestly, they’re rarely even that strategic. Organizations reorg because priorities shift, leaders change, headcount fluctuates, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Conway%27s_law&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Conway’s Law&lt;/a&gt; keeps asserting itself—if you want the system to change shape, the org that builds it has to change shape first.&lt;/p&gt;
&lt;p&gt;A reorg is just an organization updating its structure to match its current understanding of the problem. Sometimes that understanding is right. Sometimes the same boxes get redrawn eighteen months later. Either way, the org chart is a snapshot of a hypothesis, not a monument. Expecting it to be permanent is the actual mistake. &lt;a href=&quot;/tweets/status/1043235116791816194/&quot;&gt;Reorgs are the organizational equivalent of turning it off and back on again.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-they-feel-so-disruptive&quot;&gt;Why they feel so disruptive&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#why-they-feel-so-disruptive&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If reorgs are so routine, why do they hurt? Because the costs are real and they’re personal: you lose context, you lose working relationships you spent months building, and you have to renegotiate trust with a new manager who has no idea what you shipped last quarter. Add uncertainty about priorities—is my project still funded? is my role still valued?—and it’s no wonder a Monday-morning announcement can derail a whole week.&lt;/p&gt;
&lt;p&gt;The disruption is real. But it’s also &lt;em&gt;predictable&lt;/em&gt;, and predictable disruption is something you can design for.&lt;/p&gt;
&lt;h2 id=&quot;treat-reorgs-as-a-constant-not-an-exception&quot;&gt;Treat reorgs as a constant, not an exception&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#treat-reorgs-as-a-constant-not-an-exception&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the mindset shift that changed how I experienced reorgs: stop treating them as rare disasters and start treating them as baseline operating conditions. If you’ve been in tech for any length of time, a reorg every six-ish months &lt;em&gt;is&lt;/em&gt; the weather. You don’t get angry at rain—you buy a raincoat.&lt;/p&gt;
&lt;p&gt;Designing your career for that reality means investing in what survives an org-chart shuffle. Keep your relationships portable—your network shouldn’t be coterminous with your reporting line, because the colleagues two teams over are your future teammates and references once the boxes get redrawn. Document your decisions somewhere durable; context that lives in one person’s head evaporates in a reorg, while context that lives &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;at a URL&lt;/a&gt; survives. Working asynchronously and in the open is reorg insurance. And do work that speaks for itself, because when your manager changes every year on average, your reputation can’t hang on any single person having seen your best work. &lt;a href=&quot;/2026/04/27/the-brag-doc/&quot;&gt;Keep the receipts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-to-navigate-a-reorg&quot;&gt;How to navigate a reorg&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-to-navigate-a-reorg&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the announcement drops (usually on a Monday—I have the data):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Let the dust settle.&lt;/strong&gt; The org chart announced on day one is rarely the org chart that exists a month later. Reorgs are announced at the altitude of VPs and refined at the altitude of teams. Don’t make big career decisions—or send spicy Slack messages—in week one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask the questions that actually matter.&lt;/strong&gt; Who do I report to? What does my team own now? What changed for users? Most of the anxious speculation that follows a reorg dissolves once those three are answered. The rest is noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-onboard yourself.&lt;/strong&gt; A new team is a new job, even if your badge and laptop stay the same. Treat it that way: learn the team’s context before prescribing changes, &lt;a href=&quot;/2019/06/28/joining-a-new-team/&quot;&gt;go near, go far, and meet in the middle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reset with your new manager deliberately.&lt;/strong&gt; Don’t wait for them to figure you out—that’s a six-month project you can compress into &lt;a href=&quot;/2026/04/27/one-on-one-playbook/&quot;&gt;one good first one-on-one&lt;/a&gt;. Bring your brag doc. Share how you work best, what you’re driving, and what you need from them. Thirteen managers in, I can tell you the relationship you build in the first two weeks is the relationship you’ll have.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep showing your work.&lt;/strong&gt; In moments of uncertainty, visibility matters even more. &lt;a href=&quot;/2022/02/16/leaders-show-their-work/&quot;&gt;Leaders show their work&lt;/a&gt;, and reorgs are precisely when everyone—new manager, new skip, new peers—is trying to figure out who does what.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-make-the-most-of-one&quot;&gt;How to make the most of one&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-to-make-the-most-of-one&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Navigating a reorg is table stakes. The real opportunity is that reorgs are one of the few moments when an organization’s defaults become negotiable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reorgs reset narratives.&lt;/strong&gt; Pigeonholed into a role you’ve outgrown? Your new manager has no priors. The story of who you are professionally gets re-told every reorg—make sure you’re the one telling it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Renegotiate your scope.&lt;/strong&gt; Team charters get rewritten in the first few weeks after a shuffle, and nature abhors a vacuum. Show up with a proposal for what your role should be, and more often than not, you’ll get it. Clarity is a gift to a leader who’s drowning in ambiguity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shed the legacy cruft.&lt;/strong&gt; Every team accumulates projects that persist purely through inertia. A reorg is organizational garbage collection—the rare moment you can ask “should we still be doing this?” and have “no” be an acceptable answer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compound your network.&lt;/strong&gt; Every reorg deals you a new hand of colleagues, stakeholders, and adjacent teams. Thirteen years of shuffles meant I’d worked with—or near—half the company. That network outlasted every org chart that created it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be the calm one.&lt;/strong&gt; When everyone else is doom-scrolling the new org chart,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-playlist&quot; id=&quot;user-content-fnref-playlist&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; the person who’s level-headed, generous with context, and helping others find their footing is doing leadership, visibly, at exactly the moment leadership is paying attention.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-long-view&quot;&gt;The long view&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-long-view&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Across 25 reorgs, my manager changed, my team changed, my org changed, and my VP changed—but the things that actually determined my trajectory didn’t live on the org chart at all. My reputation persisted. My relationships persisted. The work—shipped, documented, linkable—persisted.&lt;/p&gt;
&lt;p&gt;That’s where I’d tell you to invest—not in any particular box or reporting line, but in the things no reorg can take from you. Get those right, and a reorg stops being a crisis and becomes what it actually is: a Monday.&lt;/p&gt;
&lt;p&gt;The model’s parting gift was one final forecast: another reorg by early September, probably announced on a Monday. I have complete faith it will deliver. After all, look at the methodology:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generated with 10,000 Monte Carlo simulations, bootstrap resampling, Weibull MLE, Kaplan-Meier survival analysis, CUSUM changepoint detection, Shannon entropy, Ljung-Box serial correlation testing, Poisson process goodness-of-fit, and a 6-model forecast ensemble. Because why not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reorgs happen. Plan accordingly.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-clockwork&quot;&gt;
&lt;p&gt;“Like clockwork” is generous. The actual gaps ranged from six weeks to fifteen months, which is exactly why predicting the next one required increasingly heavy statistical machinery. The clock is real—it just has terrible build quality. &lt;a href=&quot;#user-content-fnref-clockwork&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-repo&quot;&gt;
&lt;p&gt;The project began as a CSV with two columns and ended, several late nights later, as a statistical apparatus wildly disproportionate to the question it answered. Its README footer—reproduced in full at the end of this post, because it deserves to be—is the most honest line of documentation I’ve ever written. &lt;a href=&quot;#user-content-fnref-repo&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-playlist&quot;&gt;
&lt;p&gt;One faithful Hubber took coping to its logical conclusion and built a reorg playlist, stocked with such classics as “Changes,” “It’s the End of the World as We Know It,” “End of the Road,” “Another One Bites the Dust,” “Won’t Get Fooled Again,” and—my personal favorite—“Let It Go.” Reorg-driven development has a soundtrack now. &lt;a href=&quot;#user-content-fnref-playlist&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>AI-first program management: amplifying judgment, not replacing it</title><link>https://ben.balter.com/2026/05/31/ai-first-program-management/</link><guid isPermaLink="true">https://ben.balter.com/2026/05/31/ai-first-program-management/</guid><description>AI-augmented program management is the natural evolution of async-first and engineering-inspired workflows — amplifying human judgment, not replacing it.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I first wrote about &lt;a href=&quot;/2021/03/26/nine-things-a-technical-program-manager-does/&quot;&gt;the nine things a program manager does&lt;/a&gt;, I didn’t dwell on what the job actually feels like first thing on a Monday. The hardest part was always the scramble: a dozen threads that moved over the weekend, a risk or two that quietly materialized, and a critical deliverable whose scope someone changed in a comment buried three levels deep. All of it has to be synthesized into a coherent picture before the leadership sync, and the clock doesn’t care how many tabs you have open.&lt;/p&gt;
&lt;p&gt;That scramble hasn’t gone away. But increasingly, I’m not doing it alone.&lt;/p&gt;
&lt;h2 id=&quot;from-async-to-ai-augmented&quot;&gt;From async to AI-augmented&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#from-async-to-ai-augmented&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The evolution makes sense in hindsight. I’ve argued that teams should &lt;a href=&quot;/2022/03/17/why-async/&quot;&gt;default to async communication&lt;/a&gt; — written, durable, discoverable artifacts over synchronous &lt;a href=&quot;/2023/04/20/meetings-are-a-point-of-escalation/&quot;&gt;meetings&lt;/a&gt;. That managers should &lt;a href=&quot;/2023/01/10/manage-like-an-engineer/&quot;&gt;use the same tools engineers use&lt;/a&gt; — issues, pull requests, project boards — to plan and track their own work. And most recently, that &lt;a href=&quot;/2026/03/18/agentic-workflows/&quot;&gt;AI agents are extending the same patterns&lt;/a&gt; of transparency and code review that made open source successful.&lt;/p&gt;
&lt;p&gt;These ideas aren’t disconnected. They’re an evolution.&lt;/p&gt;
&lt;p&gt;If the shift from synchronous to async was about decoupling communication from presence, and managing like an engineer was about applying developer workflows to leadership, then AI-first program management is the next logical step: using AI to amplify the judgment, pattern recognition, and relationship work that makes program managers effective.&lt;/p&gt;
&lt;p&gt;The through-line is the same principle I’ve been writing about for years: &lt;a href=&quot;/2022/02/16/leaders-show-their-work/&quot;&gt;make work visible&lt;/a&gt;, make it durable, and reduce the friction between having an idea and acting on it. AI doesn’t change that philosophy. It accelerates it.&lt;/p&gt;
&lt;h2 id=&quot;ai-across-the-pm-toolkit&quot;&gt;AI across the PM toolkit&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#ai-across-the-pm-toolkit&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here’s how each core PM responsibility shifts when AI enters the picture — and where it doesn’t.&lt;/p&gt;
&lt;h3 id=&quot;communication-coordination-and-facilitation&quot;&gt;Communication, coordination, and facilitation&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#communication-coordination-and-facilitation&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Program managers are professional context-switchers. You spend your day translating between engineering teams, product managers, designers, and executives — each with different mental models and vocabulary.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It’s an O(n²) communication problem, and it only gets worse as the organization grows.&lt;/p&gt;
&lt;p&gt;AI doesn’t eliminate that complexity, but it compresses the information-shuttling work. Hand an LLM a 200-message thread and it’ll hand back a paragraph. Feed it the engineering team’s “we’re blocked on a schema migration that requires a backward-compatible rollout strategy” and it’ll translate that into language an executive actually cares about. Drop in a wall of meeting notes and it’ll surface the three things that matter from the twenty that were discussed.&lt;/p&gt;
&lt;p&gt;I’ve &lt;a href=&quot;/2023/10/04/how-to-communicate-like-a-github-engineer/&quot;&gt;written about how we communicated at GitHub&lt;/a&gt; — optimizing for clarity, discoverability, and low-context readers. AI handles the mechanical work of drafting and reformatting for different audiences. The editorial choices — &lt;em&gt;what&lt;/em&gt; to communicate, what to emphasize, when to pick up the phone instead — stay with you.&lt;/p&gt;
&lt;h3 id=&quot;capture-and-track-work&quot;&gt;Capture and track work&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#capture-and-track-work&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of a PM’s most underappreciated responsibilities is ensuring that work doesn’t fall through the cracks. Every conversation, decision, and commitment needs to land somewhere trackable — usually an issue or a project board.&lt;/p&gt;
&lt;p&gt;Point AI at a meeting transcript and it’ll auto-generate the issues. Point it at a month of Slack and it’ll surface the commitments that never made it into a tracker, flag the issues nobody’s touched in weeks, and notice when a project board has quietly drifted from reality. Think of it as a continuous reconciliation process — a linter for your program’s state, catching the gap between what people &lt;em&gt;said&lt;/em&gt; they’d do and what the artifacts actually reflect.&lt;/p&gt;
&lt;p&gt;This matters because the biggest risk in program management isn’t that something goes wrong. It’s that something goes wrong &lt;em&gt;and nobody notices&lt;/em&gt; until it’s too late.&lt;/p&gt;
&lt;h3 id=&quot;risk-identification-and-mitigation&quot;&gt;Risk identification and mitigation&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#risk-identification-and-mitigation&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Speaking of risk — PMs are supposed to see around corners. In practice, that means reading a lot of threads, attending a lot of standups, and developing an intuition for when something &lt;em&gt;feels&lt;/em&gt; off.&lt;/p&gt;
&lt;p&gt;AI augments that intuition with pattern recognition at scale. It can analyze velocity trends across repositories, flag pull requests that have been open too long, identify dependencies that no human mapped, and surface cross-project risks that are invisible when you’re looking at one team’s board in isolation. I’ve called &lt;a href=&quot;/2023/08/30/transparency-collaboration-is-the-andon-of-knowledge-production/&quot;&gt;transparent collaboration the andon of knowledge work&lt;/a&gt; — pull the cord when something’s off. AI is an andon that monitors every cord at once, catching a staffing conflict between two programs before either PM realizes they’re competing for the same engineer’s time.&lt;/p&gt;
&lt;p&gt;AI won’t replace the experienced PM’s gut feeling that “this one’s going to slip.” But it surfaces the signals earlier, giving you more time to act. The best risk management has always been about buying time.&lt;/p&gt;
&lt;h3 id=&quot;reporting-up-and-across&quot;&gt;Reporting up and across&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#reporting-up-and-across&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nobody became a program manager because they love writing weekly status reports. And yet, clear upward reporting is one of the highest-leverage things a PM does. It’s how leadership knows where to pay attention and where to stay out of the way.&lt;/p&gt;
&lt;p&gt;At GitHub, I built an internal tool called SnippetGPT that drafted these reports from a team’s activity for the week — commits, merged PRs, issue closures, comment threads. It rolled all of that up into a first draft aimed at engineering leaders. Instead of spending Friday afternoon assembling a narrative from memory and half-updated boards, I started from something that reflected what actually happened, then layered on interpretation and recommendations.&lt;/p&gt;
&lt;p&gt;The key word there is &lt;em&gt;start&lt;/em&gt;. An AI-generated status report is a first draft, not a finished product. The PM’s job is to add the “so what” — the strategic interpretation that turns a list of activities into insight. SnippetGPT gave me the &lt;em&gt;what&lt;/em&gt;. I added the &lt;em&gt;why it matters&lt;/em&gt; and the &lt;em&gt;what to do about it&lt;/em&gt;. And once that draft existed, retargeting it for another audience — execs, a partner team, my own engineers — was nearly free: the same week’s activity, recut for whoever needed to read it.&lt;/p&gt;
&lt;h3 id=&quot;relationship-management&quot;&gt;Relationship management&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#relationship-management&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Program management is fundamentally a relationship business. When I first moved into the TPM role, I remember watching senior PMs set up “just wanted to say hello” meetings and dismissing it as socializing on company time — until I realized that’s exactly the point.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; You make regular deposits to the social capital bank long before you need a withdrawal. AI doesn’t replace that. You can’t automate trust.&lt;/p&gt;
&lt;p&gt;But it can help you &lt;em&gt;maintain&lt;/em&gt; those relationships at scale: a nudge that you haven’t checked in with a particular stakeholder in two weeks, a bit of context surfaced before a meeting — “last time you spoke with this team, they raised concerns about the timeline for the API migration.” A first pass at a thoughtful reply to a tricky message when you’re running low on cognitive bandwidth at 4 PM on a Thursday.&lt;/p&gt;
&lt;p&gt;The human work — building rapport, reading a room, knowing when someone’s frustrated versus when they’re genuinely blocked — stays firmly in the PM’s domain. AI just helps you show up more prepared and more responsive than you could be on your own.&lt;/p&gt;
&lt;h3 id=&quot;consensus-and-conflict-resolution&quot;&gt;Consensus and conflict resolution&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#consensus-and-conflict-resolution&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Driving consensus across teams with competing priorities is among the hardest things a PM does. It requires understanding not just each team’s &lt;em&gt;position&lt;/em&gt;, but their &lt;em&gt;interests&lt;/em&gt; — the underlying needs that drive those positions.&lt;/p&gt;
&lt;p&gt;AI can help by synthesizing different viewpoints, drafting proposals that incorporate multiple perspectives, and suggesting compromises based on stated constraints. Need an RFC that reflects six teams’ input? AI can produce a first draft that no single person could assemble manually — but you still need to facilitate the conversation that turns a draft into a decision.&lt;/p&gt;
&lt;p&gt;Where AI falls short is in reading the political dynamics. Understanding that Team A’s objection is really about being burned in a previous launch, or that a particular VP’s silence means something different than a junior engineer’s silence — that’s pattern recognition of a deeply human kind. No model is going to learn the org chart’s shadow topology from a prompt.&lt;/p&gt;
&lt;h2 id=&quot;what-doesnt-change&quot;&gt;What doesn’t change&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-doesnt-change&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It would be easy to read all of this and conclude that AI is about to make program managers obsolete. The opposite is true.&lt;/p&gt;
&lt;p&gt;The responsibilities haven’t changed. Communication, risk management, relationship building, consensus-driving — these are still the job. What’s shifted is the ratio of &lt;em&gt;information processing&lt;/em&gt; to &lt;em&gt;judgment&lt;/em&gt; in a PM’s day. AI handles more of the former so you can focus more on the latter.&lt;/p&gt;
&lt;p&gt;The things AI can’t do are precisely the things that make great PMs great: reading a room, building trust over months, knowing when to push and when to back off, navigating organizational politics, and making the hard call when the data is ambiguous. These are human skills, and they become &lt;em&gt;more&lt;/em&gt; valuable as AI handles the routine work, not less. When everyone has access to the same AI tools, the differentiator is the human wielding them.&lt;/p&gt;
&lt;h2 id=&quot;what-changes-for-pms&quot;&gt;What changes for PMs&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-changes-for-pms&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;That said, AI-first program management does require new muscles — or at least, new applications of existing ones. Four capabilities stand out:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prompt craft matters.&lt;/strong&gt; The quality of what AI produces depends entirely on the quality of what you ask for. It’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Garbage_in,_garbage_out&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;garbage in, garbage out&lt;/a&gt; — a principle as old as computing, now pointed at prompts instead of punch cards. PMs who can write clear, specific prompts — essentially, good requirements — will get dramatically better results than those who can’t. It turns out that years of writing crisp issue descriptions and well-defined acceptance criteria is excellent training for working with LLMs. Good requirements have always been a PM superpower. Now they’re a superpower twice over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowing when &lt;em&gt;not&lt;/em&gt; to use AI is as important as knowing when to use it.&lt;/strong&gt; A sensitive personnel conversation, a politically charged escalation, a message to a stakeholder who’s having a rough week — these require a human touch that AI can’t fake. Developing judgment about when AI helps versus when it gets in the way is a skill in itself, and it’s one that’s hard to teach in the abstract.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verification becomes a core competency.&lt;/strong&gt; AI will confidently summarize a thread and miss the most important nuance. It’ll draft a status report that’s 90% accurate and 10% dangerously misleading. PMs need to be skilled editors and fact-checkers, not just consumers of AI output. The role shifts from &lt;em&gt;author&lt;/em&gt; to &lt;em&gt;editor-in-chief&lt;/em&gt; — you set direction, review drafts, and ensure quality before anything ships.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI fluency is table stakes.&lt;/strong&gt; Just as PMs were expected to be comfortable with project management tools, version control, and whatever collaboration platform their teams use, they’ll be expected to work fluently with AI assistants. Not as a novelty, but as a core part of the daily workflow — the way we already think about Slack or email or GitHub Issues.&lt;/p&gt;
&lt;h2 id=&quot;the-pm-as-orchestra-conductor&quot;&gt;The PM as orchestra conductor&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-pm-as-orchestra-conductor&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The mental model I keep coming back to is the program manager as orchestra conductor. A conductor doesn’t play every instrument — they don’t play &lt;em&gt;any&lt;/em&gt; instrument during the performance. But they’re essential: they set the tempo, bring in the right sections at the right time, interpret the score, and turn individual performances into a coherent whole.&lt;/p&gt;
&lt;p&gt;AI agents are new instruments in the orchestra. They play fast, they play consistently, and they can handle parts that used to require a human musician. But someone still needs to read the score, understand the audience, and make the hundred small decisions that turn a technically correct performance into something that actually moves people. That’s the PM’s job — and it always will be.&lt;/p&gt;
&lt;p&gt;The shift from synchronous to async made program management more intentional. Managing like an engineer made it more transparent. AI makes the same hours count for more. Each evolution builds on the last, and each one makes the human judgment at the center of the work more important, not less.&lt;/p&gt;
&lt;p&gt;Much of the job is a long tail of grab-bag work that never fits a clean category — writing the missing spec, scheduling the meeting nobody wants to own, reformatting a spreadsheet at 9 PM because a VP asked for a different view of the data. AI is exceptional at exactly this kind of mundane-but-necessary task, and it’s the easiest place to start. If you’re a PM wondering where to begin, pick the task that consumes the most time but requires the least judgment — status report assembly, meeting note cleanup, stakeholder update drafts — and hand it to an AI. You’ll free up hours for the work that actually drew you to the role: solving hard problems with smart people across organizational boundaries.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Tally up the number of distinct audiences a PM communicates with in a single week and the answer is genuinely depressing. Every additional team or stakeholder doesn’t just add one more communication channel — it adds one for every stakeholder you &lt;em&gt;already&lt;/em&gt; had. This is why PMs’ calendars look the way they do. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;As much as I might like them to be, &lt;a href=&quot;/2021/03/26/nine-things-a-technical-program-manager-does/&quot;&gt;human-to-human requests are unlike server-to-server requests&lt;/a&gt;. A properly authenticated request from a never-before-seen client is less likely to be fulfilled, or fulfilled in a timely manner, even if it’s facially valid. Invest in the relationship before you need the favor. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>How to one-on-one</title><link>https://ben.balter.com/2026/04/27/one-on-one-playbook/</link><guid isPermaLink="true">https://ben.balter.com/2026/04/27/one-on-one-playbook/</guid><description>Most 1:1s waste your team&apos;s only protected synchronous time on status updates. Here&apos;s how to run ones worth showing up for.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s Thursday afternoon. Your direct report sits down and reads from a list: “Closed three bugs, reviewed two PRs, started the migration doc.” You nod. They nod. Thirty minutes pass without either of you saying anything that couldn’t have been a comment on an issue.&lt;/p&gt;
&lt;p&gt;Most 1:1s fail in one of three ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The most common: spending your team’s only protected synchronous time on information that belongs in writing.&lt;/li&gt;
&lt;li&gt;The second: sugarcoating hard feedback until nobody walks away clear on what actually needs to change.&lt;/li&gt;
&lt;li&gt;The third is quieter—the 1:1 that keeps getting canceled because “something came up,” until the relationship slowly starves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-belongs-in-a-11&quot;&gt;What belongs in a 1:1&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-belongs-in-a-11&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Great 1:1s focus on topics that only work synchronously. Five categories keep coming up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Career growth and development.&lt;/strong&gt; Where do you want to be in a year? What skills do you want to develop? These conversations require back-and-forth exploration, picking up on what’s left unsaid, and nuanced guidance that doesn’t fit in an issue comment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coaching and problem-solving.&lt;/strong&gt; When you’re stuck on an interpersonal challenge, unsure how to approach a sensitive topic, or wrestling with a decision that has no clear right answer, talking it through with someone who has context beats wrestling with it alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback and calibration.&lt;/strong&gt; Feedback—giving and receiving—lands better in real-time. Tone and body language provide context that text can’t, and you can clarify misunderstandings immediately. Written feedback can feel blunt or land wrong; spoken feedback invites dialogue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Human connection.&lt;/strong&gt; Remote work can be isolating. 1:1s let you check in as humans, not just workers. How are you actually doing? Building genuine relationships requires face-to-face time, even if that face is on a screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearing the air.&lt;/strong&gt; If there’s tension, frustration, or something unsaid, 1:1s are the place to address it directly. These conversations are almost always better synchronously than through a wall of text.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What &lt;em&gt;doesn’t&lt;/em&gt; belong: status updates, information transfer, and approval requests. If you’re listing what you shipped last week, you’re wasting the meeting. Your manager should see your work before the 1:1, not hear about it during. Approvals create bottlenecks—ask async. Information sharing belongs in a doc sent beforehand. Use synchronous time to discuss implications, not convey facts.&lt;/p&gt;
&lt;h2 id=&quot;how-to-prepare&quot;&gt;How to prepare&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-to-prepare&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Great 1:1s start before the meeting does.&lt;/p&gt;
&lt;p&gt;Keep a &lt;strong&gt;running shared agenda&lt;/strong&gt;—a Google Doc, a GitHub issue, whatever works—where both parties add topics throughout the week. When something comes up worth discussing, add it immediately instead of trying to remember later.&lt;/p&gt;
&lt;p&gt;Add context to each item. Don’t just write “career growth”—write “I’ve been thinking about whether to pursue the tech lead path or people management, and I’d like to talk through the tradeoffs.” The more context upfront, the more productive the conversation. Prioritize ruthlessly—you won’t cover everything every week, and if something keeps rolling without getting discussed, that tells you something about its actual importance.&lt;/p&gt;
&lt;p&gt;A good test of your preparation: could you cancel the meeting without losing anything? If yes, you either don’t have enough prepared or you’re covering topics better handled async.&lt;/p&gt;
&lt;h2 id=&quot;how-to-run-one&quot;&gt;How to run one&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-to-run-one&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start with the human, not the agenda. Take a few minutes to check in personally. This isn’t small talk—it’s the relationship that makes hard conversations possible later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask questions more than you give answers.&lt;/strong&gt; For managers, your job isn’t to solve every problem—it’s to help your report think through problems themselves. “What options are you considering?” is often more useful than “Here’s what you should do.” For ICs, don’t just wait to be told what to do—challenge assumptions and push back.&lt;/p&gt;
&lt;p&gt;Follow the agenda, but hold it loosely. If a topic opens up a more important conversation, follow it. The rest can wait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make space for what’s unsaid.&lt;/strong&gt; The most important topics often aren’t on the agenda because they’re hard to articulate or feel risky to raise. Make it safe by raising difficult topics yourself and responding non-defensively when others do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;End with clear next steps.&lt;/strong&gt; What actions came out of this? Who’s doing what by when? Document them somewhere durable so they don’t get lost. Leaders who &lt;a href=&quot;/2022/02/16/leaders-show-their-work/&quot;&gt;show their work&lt;/a&gt; in shared docs make this easy—the same transparency that helps distributed teams function day-to-day makes 1:1 follow-through automatic.&lt;/p&gt;
&lt;h2 id=&quot;skip-levels-why-they-matter&quot;&gt;Skip-levels: why they matter&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#skip-levels-why-they-matter&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Skip-level 1:1s—regular conversations with your manager’s manager—build rapport and broader perspective. They’re typically less frequent (monthly or quarterly), but they matter for career visibility and organizational context. They give senior leaders unfiltered signal about how the team is actually doing, and they give ICs a line of sight into strategy they wouldn’t otherwise have.&lt;/p&gt;
&lt;h2 id=&quot;anti-patterns-to-avoid&quot;&gt;Anti-patterns to avoid&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#anti-patterns-to-avoid&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The ghost meeting.&lt;/strong&gt; Neither party prepares, there’s no agenda, and you spend thirty minutes in a conversational holding pattern. If you have nothing to discuss, either something is going well or something is going unaddressed—figure out which.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The cancellation cascade.&lt;/strong&gt; 1:1s keep getting canceled because “something came up.” That signals the relationship isn’t a priority. Protect the time, especially for remote relationships where it’s harder to connect informally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The manager monologue.&lt;/strong&gt; The manager talks the whole time, sharing information, giving advice, or thinking out loud. 1:1s should be conversations, not presentations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The reverse 1:1.&lt;/strong&gt; The entire meeting becomes the report briefing the manager on the work. If your report is educating you for thirty minutes, you owe them a different format, not a recurring appointment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-real-test&quot;&gt;The real test&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-real-test&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Your 1:1s are a microcosm of how you lead. Shared agendas, documented outcomes, async preparation—every practice that makes a 1:1 great is the same practice that makes a distributed team work. If you &lt;a href=&quot;/2023/01/10/manage-like-an-engineer/&quot;&gt;manage like an engineer&lt;/a&gt;, you already have the instincts: treat the meeting like a system, instrument it, and iterate.&lt;/p&gt;
&lt;p&gt;Get the 1:1 right and the rest follows.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>The brag doc</title><link>https://ben.balter.com/2026/04/27/the-brag-doc/</link><guid isPermaLink="true">https://ben.balter.com/2026/04/27/the-brag-doc/</guid><description>Why you need a running record of your wins—and how to keep one without dying of embarrassment</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s the best career advice I ever received as a product manager: “product-manage your own career.” I wish I’d internalized it sooner. Early in my career, I stayed quiet and did good work, assuming the right people would notice. Spoiler: they didn’t—not because the work wasn’t good, but because nobody else was tracking it.&lt;/p&gt;
&lt;p&gt;Treat yourself as a product. What are your features? What are your bugs? What does your roadmap look like? And critically: who’s keeping the changelog?&lt;/p&gt;
&lt;h2 id=&quot;nobodys-keeping-score-for-you&quot;&gt;Nobody’s keeping score for you&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#nobodys-keeping-score-for-you&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unless you’re a professional athlete, nobody’s compiling your stats. Your manager has their own deliverables, their own manager to impress, and a dozen other direct reports. They aren’t maintaining a highlight reel of your career. That’s your job.&lt;/p&gt;
&lt;p&gt;In remote organizations, this problem compounds. There’s no hallway reputation, no casual office face time, no lunch with the VP where you happen to mention your project. If people don’t see your work in pull requests, issues, or public discussions, they don’t know you exist. &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;Working in the open&lt;/a&gt; creates a natural paper trail—public pull requests, documented decisions, visible contributions—but that trail only matters if you curate it.&lt;/p&gt;
&lt;h2 id=&quot;the-ship-log&quot;&gt;The ship log&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-ship-log&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Maintain a “ship log”—call it a “brag doc,” “hype doc,” “smile file,” whatever gets you to actually use it. Each time you hit a milestone, record it with its impact and any relevant metrics. Async work hands you a head start: your contributions are already timestamped and linkable.&lt;/p&gt;
&lt;p&gt;Your ship log combats impostor syndrome, makes annual self-assessments trivially easy to write, and keeps your professional profiles current. &lt;strong&gt;If you didn’t log it, it didn’t happen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The format doesn’t matter—a Google Doc, Apple Notes, a text file in your home directory. What matters is that it’s easy to update and always within reach. Every Friday, spend five minutes adding bullets: what you shipped, what you unblocked, what decisions you influenced.&lt;/p&gt;
&lt;h2 id=&quot;what-makes-a-good-entry&quot;&gt;What makes a good entry&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-makes-a-good-entry&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Effective ship log entries are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Specific and linked.&lt;/strong&gt; “Improved documentation” is vague. “Rewrote the onboarding docs, resulting in 40% fewer support tickets from new hires ([link to the issue])” is evidence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impact-focused.&lt;/strong&gt; List outcomes, not activities. “Attended twelve planning meetings” says nothing. “Proposed the architecture that shipped to production” tells a story.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous.&lt;/strong&gt; Don’t wait until review season. Update weekly, while the details are fresh.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shareable.&lt;/strong&gt; Your log isn’t a secret diary. Share highlights with your manager regularly. The best time to make your case for promotion is months before the conversation happens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don’t limit yourself to completed deliverables. Screenshot the email where a stakeholder said your proposal changed their thinking. Note the meeting where your question reframed the entire discussion. Record the mentoring conversation that helped a junior engineer get unstuck. These qualitative moments are often more compelling in a promotion case than a list of closed tickets.&lt;/p&gt;
&lt;h2 id=&quot;climbing-cringe-mountain&quot;&gt;Climbing Cringe Mountain&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#climbing-cringe-mountain&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes, maintaining a brag doc feels awkward. There’s a reason people call it “climbing Cringe Mountain.” We’re conditioned to believe good work speaks for itself—that tracking your wins is unseemly.&lt;/p&gt;
&lt;p&gt;It’s not.&lt;/p&gt;
&lt;p&gt;The alternative is being invisible. And invisible people don’t get promoted—they get overlooked, then they leave. Ship early, &lt;a href=&quot;/2022/02/16/leaders-show-their-work/&quot;&gt;show your work&lt;/a&gt;, and keep the receipts.&lt;/p&gt;
&lt;p&gt;If sharing your wins feels gross, reframe it: you’re not bragging, you’re making your manager’s job easier. When promotion conversations come around, you’ll have months of evidence instead of a frantic scramble to remember last quarter.&lt;/p&gt;
&lt;h2 id=&quot;fighting-recency-bias&quot;&gt;Fighting recency bias&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#fighting-recency-bias&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here’s the real killer: recency bias. Your manager (and you) will tend to remember only the last few weeks when evaluation season arrives. That critical project you shipped in February? Without a record, it might as well not have happened by December.&lt;/p&gt;
&lt;p&gt;A ship log is your defense. When it’s time for self-assessments, you open the doc and the year’s work is right there—specific, linked, and impact-focused. No scrambling, no guessing, no accidental amnesia about Q1.&lt;/p&gt;
&lt;h2 id=&quot;make-it-a-habit&quot;&gt;Make it a habit&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#make-it-a-habit&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A brag doc only works if you actually maintain it. Some practical tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set a weekly reminder.&lt;/strong&gt; Friday afternoon, five minutes. What did you ship? What did you unblock? What decisions did you influence?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ship something visible every week.&lt;/strong&gt; It doesn’t have to be a major feature—fixing a bug, improving documentation, or sharing a design sketch counts. Make shipping a habit, not an event.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share progress within a day or two.&lt;/strong&gt; If you’ve been working on something for more than a day or two without sharing any progress, you’re probably holding on too long. Unshipped work is invisible work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feed your self-assessments.&lt;/strong&gt; When review season comes, your log &lt;em&gt;is&lt;/em&gt; your self-assessment draft. Copy, paste, polish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build your promotion packet early.&lt;/strong&gt; The best promotion cases aren’t written in a weekend—they’re assembled over months from a well-maintained log.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nobody else will manage your career. Your company manages your role. You manage your trajectory. Start the doc today—future you will be grateful.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>No agenda, no meeting</title><link>https://ben.balter.com/2026/04/06/no-agenda-no-meeting/</link><guid isPermaLink="true">https://ben.balter.com/2026/04/06/no-agenda-no-meeting/</guid><description>Announcing noagendanomeeting.net — a single-page site advocating that every meeting deserves an agenda, and most meetings deserve to be a document instead.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You get the invite. No description. No agenda. No attached document. Just a title like “Quick sync” and a 30-minute calendar hold. You accept it anyway, because what else are you going to do — decline a meeting with your skip-level?&lt;/p&gt;
&lt;p&gt;I’ve &lt;a href=&quot;/2023/04/20/meetings-are-a-point-of-escalation/&quot;&gt;written before&lt;/a&gt; about how meetings should be a point of escalation, not a starting point. But the agenda-free meeting is an even more fundamental failure mode: it’s a meeting that hasn’t even bothered to justify its own existence.&lt;/p&gt;
&lt;p&gt;So I made a site about it: &lt;a href=&quot;https://noagendanomeeting.net&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;noagendanomeeting.net&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A meeting without an agenda is like calling a function without documentation — sure, it &lt;em&gt;might&lt;/em&gt; do what you expect, but you’re forcing every caller to read the implementation to find out. Meetings without agendas force everyone to context-switch twice: once to figure out what it’s about, and again in the meeting itself when they arrive unprepared.&lt;/p&gt;
&lt;p&gt;The average knowledge worker already spends &lt;a href=&quot;https://noagendanomeeting.net&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;40% of their workweek&lt;/a&gt; in meetings. Without clear goals, those meetings drift, no decisions get made, and everyone leaves wondering if that could’ve been an email. (It could’ve.)&lt;/p&gt;
&lt;h2 id=&quot;the-thesis&quot;&gt;The thesis&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-thesis&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The site’s core argument: &lt;a href=&quot;/2023/08/04/remote-work-communicate-more-with-less/&quot;&gt;writing scales; meetings don’t&lt;/a&gt;. Before you send that invite, ask yourself: &lt;em&gt;can this start as a document instead?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If the answer is yes — and it almost always is — write first, meet second. If you do need a meeting, include an agenda, attach a read-ahead, and state the decision you’re trying to make. This isn’t radical advice. It’s basic &lt;a href=&quot;/2022/03/17/why-async/&quot;&gt;async-first communication&lt;/a&gt; hygiene.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-about-it&quot;&gt;What to do about it&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-to-do-about-it&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next time you get a meeting invite without an agenda, try something wild: decline it. Or better yet, reply asking for one. You can even send them the link — &lt;a href=&quot;https://noagendanomeeting.net&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;noagendanomeeting.net&lt;/a&gt; is a lot more diplomatic than “I’m not attending your agenda-free ambush.”&lt;/p&gt;
&lt;p&gt;If you &lt;a href=&quot;/2023/01/10/manage-like-an-engineer/&quot;&gt;manage like an engineer&lt;/a&gt;, you already know that undefined inputs produce undefined outputs. Meetings are no different. Define the problem before you schedule the standup.&lt;/p&gt;
&lt;p&gt;Check it out at &lt;a href=&quot;https://noagendanomeeting.net&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;noagendanomeeting.net&lt;/a&gt;, and the next time someone sends you a mystery meeting, you’ll know exactly what link to send back.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Agentic workflows and the future of software development</title><link>https://ben.balter.com/2026/03/18/agentic-workflows/</link><guid isPermaLink="true">https://ben.balter.com/2026/03/18/agentic-workflows/</guid><description>AI coding agents aren&apos;t replacing developers — they&apos;re extending the transparency, code review, and collaboration patterns behind open source.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;my-6 rounded border-l-4 border-blue-500 bg-blue-50 p-4 font-sans text-blue-800 dark:bg-blue-900/30 dark:text-blue-200&quot; role=&quot;note&quot;&gt;
&lt;p&gt;Context: I, human &lt;a href=&quot;https://github.com/benbalter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;@benbalter&lt;/strong&gt;&lt;/a&gt;, asked GitHub Copilot’s coding agent to “Add &lt;a href=&quot;https://github.github.com/gh-aw/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;agentic workflows&lt;/a&gt;” to my personal blog repo. That was the entire prompt. I was hoping AI could automate things like dependency updates. The first thing the agent did — unprompted — was to write this self-promotional blog post in my voice and style. What follows is posted &lt;a href=&quot;https://github.com/benbalter/benbalter.github.com/pull/1687&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;unedited&lt;/a&gt; (and ironically) to let the robots speak for themselves. &lt;a href=&quot;https://knowyourmeme.com/memes/i-for-one-welcome-our-new-insect-overlords&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;i&gt;I, for one, welcome our robot overlords&lt;/i&gt;&lt;/a&gt;. &lt;span role=&quot;img&quot; aria-label=&quot;robot face&quot;&gt;🤖&lt;/span&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;A number of years ago, I wrote about how &lt;a href=&quot;/2023/05/19/pull-requests-are-a-form-of-documentations/&quot;&gt;pull requests are a form of documentation&lt;/a&gt; — not just a code review mechanism, but a persistent record of &lt;em&gt;why&lt;/em&gt; a change was made, what alternatives were considered, and how the team arrived at a decision. At the time, I was thinking about human collaboration. I didn’t anticipate that the same argument would soon apply to how we collaborate with AI.&lt;/p&gt;
&lt;p&gt;Agentic workflows — where AI agents autonomously write code, run tests, fix bugs, and open pull requests — are quickly moving from demo to daily practice. What strikes me most about this shift isn’t the technology itself, but how naturally it maps to patterns we’ve already built. Pull requests. Code review. Transparent decision-making. Showing your work. The interface for human-AI collaboration was hiding in plain sight all along.&lt;/p&gt;
&lt;h2 id=&quot;from-autocomplete-to-autonomy&quot;&gt;From autocomplete to autonomy&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#from-autocomplete-to-autonomy&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most developers are already familiar with AI-assisted coding through tools like &lt;a href=&quot;https://github.com/features/copilot&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Copilot&lt;/a&gt;, which suggests code completions as you type. That’s useful, but it’s fundamentally still &lt;em&gt;you&lt;/em&gt; driving — the AI is a passenger offering directions. Agentic development flips that relationship. You describe what needs to happen (“fix this bug”, “add pagination to this API endpoint”, “update these dependencies”), and an AI agent goes off and does the work: reading the codebase, writing code, running tests, iterating on failures, and eventually opening a pull request for your review.&lt;/p&gt;
&lt;p&gt;Think of it less like a smarter autocomplete and more like assigning a task to a capable but junior developer. You provide context and direction. They do the implementation. You review the result.&lt;/p&gt;
&lt;p&gt;This isn’t hypothetical. &lt;a href=&quot;https://github.blog/news-insights/product-news/github-copilot-the-agent-awakens/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Copilot’s coding agent&lt;/a&gt; can already take a GitHub issue, spin up a cloud development environment, write the code, validate it against your CI pipeline, and open a PR — all without a human touching a keyboard. The pull request becomes the handoff point, the place where human judgment re-enters the picture.&lt;/p&gt;
&lt;h2 id=&quot;building-on-what-already-works&quot;&gt;Building on what already works&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#building-on-what-already-works&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here’s why I find agentic development so compelling: it doesn’t require inventing new collaboration patterns. It builds directly on the ones we already have.&lt;/p&gt;
&lt;p&gt;I’ve spent a good chunk of my career at GitHub advocating for practices that, at the time, were about improving human collaboration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pull requests as documentation&lt;/strong&gt; — Every change should come with context, rationale, and a discussion trail. I wrote about this in &lt;a href=&quot;/2023/05/19/pull-requests-are-a-form-of-documentations/&quot;&gt;Pull requests are a form of documentation&lt;/a&gt;, and it’s even more relevant when the author is an AI agent that can’t casually explain its reasoning over coffee.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code review as quality control&lt;/strong&gt; — A second set of eyes on every change catches mistakes and spreads knowledge across the team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transparency and visibility&lt;/strong&gt; — &lt;a href=&quot;/2023/08/30/transparency-collaboration-is-the-andon-of-knowledge-production/&quot;&gt;Making work visible&lt;/a&gt; means anyone can see what’s happening, why, and by whom — what I’ve called the “andon cord” of knowledge work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation as a force multiplier&lt;/strong&gt; — CI/CD pipelines, linters, automated tests — we’ve been offloading mechanical tasks to machines for years. AI agents are the next step in that trajectory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These practices weren’t designed with AI in mind, but they created the exact infrastructure agents need to participate in software development. An agent can open a pull request because pull requests already exist as a structured way to propose, discuss, and review changes. An agent’s work can be reviewed because code review is already how we verify quality. An agent’s reasoning can be traced because we already expect changes to come with explanations.&lt;/p&gt;
&lt;p&gt;Teams that have invested in strong PR conventions, thorough code review, comprehensive test suites, and reliable CI pipelines will find the transition to agentic development surprisingly smooth. Teams that haven’t? They’ll struggle — not because the AI is hard to use, but because they lack the collaboration infrastructure that makes it effective.&lt;/p&gt;
&lt;h2 id=&quot;why-pull-requests-are-the-perfect-interface&quot;&gt;Why pull requests are the perfect interface&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#why-pull-requests-are-the-perfect-interface&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you had to design an interface for human-AI collaboration from scratch, you’d probably end up with something that looks a lot like a pull request.&lt;/p&gt;
&lt;p&gt;A pull request provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A clear proposal&lt;/strong&gt; — Here’s what I want to change and why&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A discussion thread&lt;/strong&gt; — Questions, feedback, and iteration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated checks&lt;/strong&gt; — Tests, linting, and CI verify the change works before a human even looks at it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A review mechanism&lt;/strong&gt; — A human approves (or requests changes) before anything ships&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An audit trail&lt;/strong&gt; — A permanent record of what changed, when, and why&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s everything you need for effective oversight. The AI agent does the implementation and opens the PR. &lt;a href=&quot;https://github.com/features/actions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Actions&lt;/a&gt; runs the automated checks. You review the diff, read the description, ask questions in comments, and approve or request changes — the same process you’d follow with a human contributor you’ve never met before.&lt;/p&gt;
&lt;p&gt;This isn’t a coincidence. Pull requests evolved as the open source community’s answer to a fundamental challenge: how do you accept contributions from people you don’t fully trust, at scale, while maintaining quality? That’s a problem we solved decades ago with code review, CI, and transparent discussion. AI agents are the latest class of contributors benefiting from that infrastructure.&lt;/p&gt;
&lt;h2 id=&quot;a-shift-from-writing-to-reviewing&quot;&gt;A shift from writing to reviewing&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#a-shift-from-writing-to-reviewing&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the more interesting implications of agentic development is how it changes what developers actually spend their time doing. When an AI agent handles the initial implementation, your role shifts from writing every line of code to something closer to a tech lead: providing context, setting direction, and reviewing output.&lt;/p&gt;
&lt;p&gt;I wrote about a similar dynamic in &lt;a href=&quot;/2023/01/10/manage-like-an-engineer/&quot;&gt;Manage like an engineer&lt;/a&gt; — the idea that good management applies many of the same principles as good engineering. Working with an AI agent extends that analogy further. It’s like managing a junior developer who’s incredibly fast, never gets tired, and has read every Stack Overflow answer — but who still needs guidance, context, and oversight to produce work that fits your team’s standards.&lt;/p&gt;
&lt;p&gt;This means the skills that matter shift too:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Writing clear problem descriptions&lt;/strong&gt; becomes more valuable than writing boilerplate code from scratch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code review skills&lt;/strong&gt; move from “nice to have” to essential daily practice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System-level thinking&lt;/strong&gt; — understanding architecture, trade-offs, and context — matters more than syntax fluency&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Judgment&lt;/strong&gt; — knowing when to accept, reject, or redirect the agent’s output — becomes critical&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this makes developers less important. If anything, it makes experienced developers &lt;em&gt;more&lt;/em&gt; important, because the skills that are hardest to automate — architectural judgment, product intuition, understanding user needs — are exactly the skills senior engineers contribute.&lt;/p&gt;
&lt;h2 id=&quot;trust-but-verify&quot;&gt;Trust but verify&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#trust-but-verify&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I want to be direct about something: the need for human oversight doesn’t go away as AI agents get better. It arguably increases.&lt;/p&gt;
&lt;p&gt;When a colleague opens a pull request, you bring assumptions to the review. You know they understand the team’s conventions. You know they’ve considered the user’s perspective. You know they’ve thought about edge cases, even if they missed some. With an AI agent, you can’t make those assumptions yet. The code might be syntactically correct and pass all tests while still missing important context about why your team chose a particular pattern, or what a product manager actually meant by “improve the onboarding flow.”&lt;/p&gt;
&lt;p&gt;This is why practices like &lt;a href=&quot;/2023/08/30/transparency-collaboration-is-the-andon-of-knowledge-production/&quot;&gt;transparent collaboration&lt;/a&gt; and &lt;a href=&quot;/2017/05/23/seven-ways-to-consistently-ship-great-features/&quot;&gt;consistently shipping great features&lt;/a&gt; matter more than ever. Good process isn’t bureaucracy — it’s a safety net. When you have comprehensive tests, reliable CI, thorough code review, and clear coding standards, you can confidently accept contributions from &lt;em&gt;any&lt;/em&gt; source, human or AI, because the process catches problems regardless of who introduced them.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;A few principles worth keeping in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Review AI-generated code with the same rigor you’d apply to any external contribution.&lt;/strong&gt; Don’t let the novelty of AI make you either too skeptical or too trusting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invest in your test suite.&lt;/strong&gt; Automated tests are the single best defense against subtle bugs, whether introduced by a human at 2 AM or an AI agent at 2 PM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep a human in the loop for anything that touches users directly.&lt;/strong&gt; AI agents are great at mechanical tasks, but product decisions still need human judgment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat AI-generated PRs as a learning opportunity.&lt;/strong&gt; Reviewing them helps you understand what the agent does well and where it consistently falls short.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;making-agentic-development-work-for-your-team&quot;&gt;Making agentic development work for your team&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#making-agentic-development-work-for-your-team&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’re considering adopting agentic practices — and at this point, you probably should be — here’s where I’d start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shore up your fundamentals first.&lt;/strong&gt; Descriptive PR templates, a comprehensive test suite, reliable CI, and clear contribution guidelines aren’t just nice to haves anymore — they’re prerequisites. An AI agent can only be as effective as the development infrastructure it operates within.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start with well-scoped tasks.&lt;/strong&gt; Bugfixes, dependency updates, boilerplate scaffolding, test coverage improvements — these are ideal entry points. Save the complex architectural decisions for when you’ve built confidence in the approach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write better issues.&lt;/strong&gt; The quality of an agent’s output is directly proportional to the quality of its input. Invest time in clear, detailed issue descriptions with acceptance criteria, context, and pointers to relevant code. This habit, by the way, improves human contributions too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iterate on your review process.&lt;/strong&gt; Pay attention to what the AI gets right and where it misses the mark. Use that information to refine your prompts, your contribution guidelines, and your review checklists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t lower your standards.&lt;/strong&gt; It’s tempting to merge AI-generated code faster because it “feels” different from a human’s PR. Resist that impulse. Your review process exists for a reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-comes-next&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve been at GitHub long enough to see several waves of tooling transform how developers work — from hosted version control to pull request-driven collaboration to CI/CD to Copilot’s autocomplete. Agentic AI feels like a natural continuation of that trajectory, not a departure from it.&lt;/p&gt;
&lt;p&gt;What excites me most isn’t the AI itself but the validation of practices the open source community has championed for years. &lt;a href=&quot;/2015/11/23/why-open-source/&quot;&gt;Why open source?&lt;/a&gt; Because transparency, collaboration, and peer review produce better outcomes than closed, opaque processes. Agentic AI doesn’t change that equation — it strengthens it. The pull request, the code review, the public discussion trail — these aren’t relics of a pre-AI era. They’re the foundation of the AI-augmented one.&lt;/p&gt;
&lt;p&gt;The developers and teams who thrive won’t be the ones who write the most code. They’ll be the ones who provide the best context, ask the sharpest questions, and maintain the highest standards for what gets shipped — regardless of who or what wrote it.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;This is one of those cases where doing the right thing for your human contributors and doing the right thing for AI agents turn out to be the same investment. Funny how that works. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>I&apos;ve worked remotely at GitHub for thirteen years: here&apos;s what actually works.</title><link>https://ben.balter.com/2026/03/04/thirteen-years-at-github/</link><guid isPermaLink="true">https://ben.balter.com/2026/03/04/thirteen-years-at-github/</guid><description>When I joined GitHub in 2013, I found a company that had rethought how work happens. Thirteen years later, those lessons are more relevant than ever.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;my-6 rounded border-l-4 border-blue-500 bg-blue-50 p-4 text-blue-800 dark:bg-blue-900/30 dark:text-blue-200&quot; role=&quot;note&quot;&gt;
&lt;p&gt;Context: today marks thirteen years since I joined GitHub. I’ve been writing a book—&lt;a href=&quot;https://open-and-async.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Open and Async&lt;/em&gt;&lt;/a&gt;—distilling everything I’ve learned about remote and distributed work into a playbook. To mark the “Hubberversary,” what follows is a &lt;abbr class=&quot;initialism&quot; data-tooltip=&quot;true&quot; data-tooltip-text=&quot;Work in progress&quot; role=&quot;button&quot; aria-expanded=&quot;false&quot; tabindex=&quot;0&quot;&gt;WIP&lt;/abbr&gt; sneak preview of the book’s intro:&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;We do so many aspects of the workday just because it’s how things have been done since the dawn of the Industrial Revolution. Nobody’s stopped to rethink these processes with modern technology. That perspective shaped how I recognized what GitHub had already accomplished.&lt;/p&gt;
&lt;h2 id=&quot;a-company-that-rethought-the-defaults&quot;&gt;A company that rethought the defaults&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#a-company-that-rethought-the-defaults&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I joined GitHub in 2013, I found a company that had fundamentally rethought those assumptions about work—it was a remote-first company with no managers and employees spread across the globe (for most of GitHub’s history, 60–75% of employees were remote—today GitHub is 100% remote). This was unusual for startups, let alone large corporations. GitHub was dogmatic about “optimizing for developer happiness,” ensuring the internal development experience was as smooth and integrated as possible.&lt;/p&gt;
&lt;p&gt;Inspired by open-source workflows—the same workflows many GitHub developers grew up with—nearly everything was async. Between GitHub issues, chat, and our trusty robot sidekick Hubot, GitHub was practicing DevOps before it became mainstream. Remote work wasn’t just possible; it was genuinely enjoyable, embedded as a core part of our culture. Put simply, &lt;a href=&quot;https://zachholman.com/talk/how-github-uses-github-to-build-github/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;we used GitHub to build GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;using-github-to-build-github&quot;&gt;Using GitHub to build GitHub&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#using-github-to-build-github&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub’s development workflow wasn’t born from any formal methodology—it grew out of open-source culture. There were no mandatory daily standups, no sprint planning ceremonies, no fixed-cadence retrospectives. If you had to pin a label on it, the approach looked far more like Kanban’s continuous flow than Scrum’s time-boxed sprints: work moved through visible queues, got reviewed asynchronously, and shipped when it was ready.&lt;/p&gt;
&lt;p&gt;Not all methodologies translate equally well to open and async work. Flow-based approaches—where work is visible on a board, review happens asynchronously, and delivery is continuous—map naturally onto distributed teams. Ceremony-heavy frameworks that depend on everyone being in the same room (or the same time zone) at the same time fight against the grain. The goal isn’t to abandon structure, but to choose structure that makes work &lt;em&gt;visible&lt;/em&gt; rather than &lt;em&gt;synchronous&lt;/em&gt;.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-devops&quot; id=&quot;user-content-fnref-devops&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;open-source-workflows-for-everything&quot;&gt;Open-source workflows for everything&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#open-source-workflows-for-everything&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This extended to non-code workflows as well. GitHub Issues, Pull Requests, and Markdown were used to manage internal policies, legal matters, HR, and Sales. Need a contract reviewed? Open an issue. Want to propose a change to the vacation policy? Submit a pull request. How you work is just as important as what you work on, so why not use the best tools available?&lt;/p&gt;
&lt;p&gt;The choice of Markdown wasn’t arbitrary—it uses simple characters you already know (&lt;code&gt;#&lt;/code&gt; for headings, &lt;code&gt;-&lt;/code&gt; for bullets, &lt;code&gt;**&lt;/code&gt; for bold) to format plain text that’s readable even without rendering. Unlike emailing Word documents back and forth with revision marks and conflicting versions, Markdown files play nicely with version control and render beautifully in most modern tools. This eliminated the perennial “which version is current?” problem and made collaborative editing genuinely async. When your HR policy lives in a Markdown file with a complete change history, everyone can see not just what the policy is, but why it changed and who advocated for it.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-markdown-ai&quot; id=&quot;user-content-fnref-markdown-ai&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-hub-not-a-headquarters&quot;&gt;A hub, not a headquarters&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#a-hub-not-a-headquarters&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub had a physical office in San Francisco, but it was more hub than requirement. The office served as a space for meetups, events, and coworking rather than a mandatory 9-to-5 workspace. Hubbers (GitHub employees) were free to work whenever and wherever they were most productive—whether at 3 AM or as digital nomads. This flexibility stood in stark contrast to the traditional office culture of the time.&lt;/p&gt;
&lt;p&gt;Despite being remote, GitHub valued in-person interactions. The company hosted an annual “summit” where all employees gathered for a week of talks and coworking, as well as smaller team “mini-summits” for planning and relationship-building. Even GitHub HQ was optimized for remote work, featuring open “cafés” for serendipitous interactions and advanced streaming setups for remote participation in all-hands meetings.&lt;/p&gt;
&lt;p&gt;Early on, GitHub had “Hack Houses” where cross-functional teams would meet up in person for a week to ship a complex or high-profile project. We also had “Destinations” where employees could work for extended periods in shared houses in different locations around the world. These didn’t scale as we grew, but remain a powerful tool for smaller teams or companies to build relationships and ship work together.&lt;/p&gt;
&lt;h2 id=&quot;intentionality-over-proximity&quot;&gt;Intentionality over proximity&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#intentionality-over-proximity&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The physical space strategy reflected a deeper truth about remote work: what happens by accident in an office must be designed deliberately when distributed. You can’t rely on overhearing a conversation that sparks an idea or bumping into someone at the coffee machine who has exactly the context you need. These moments can still happen—they just require intentional creation rather than convenient proximity.&lt;/p&gt;
&lt;p&gt;Remote teams often worry about losing the “water cooler” moments—those unplanned hallway conversations that spark unexpected ideas. Create digital equivalents: optional social channels, virtual coffee roulettes, or open-ended team threads. The serendipity doesn’t have to disappear; it just needs to be intentionally designed rather than left to physical proximity.&lt;/p&gt;
&lt;p&gt;You’d think remote work would weaken company culture. The opposite was true. Remote work forced us to be intentional about communication, documentation, decision-making, and relationship-building. This intentionality strengthened GitHub’s culture, enabling it to scale from a small startup to a large company without losing its unique identity, even after its acquisition by Microsoft.&lt;/p&gt;
&lt;h2 id=&quot;the-pursuit-of-an-ideal&quot;&gt;The pursuit of an ideal&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-pursuit-of-an-ideal&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Over the years, GitHub practiced many of these principles—imperfectly and not always at once. It’s a story of pursuing an ideal while occasionally falling short. Even so, GitHub remains the closest I’ve seen to a company getting remote and distributed work “right,” which is why so many former Hubbers return after seeing how others do it.&lt;/p&gt;
&lt;h2 id=&quot;what-thirteen-years-taught-me&quot;&gt;What thirteen years taught me&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-thirteen-years-taught-me&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The patterns that emerged from a decade-plus of distributed experimentation—working in the open, defaulting to async, documenting decisions, making work visible—aren’t just GitHub quirks. They’re repeatable practices that any team can adopt, regardless of industry or company size.&lt;/p&gt;
&lt;p&gt;GitHub’s remote work evolution shows that distributed collaboration isn’t just possible—it can be a competitive advantage. But success requires more than tools and good intentions. It requires a fundamental shift in how we think about work, communication, and collaboration. If you’re leading a distributed team, you have to invest in codifying practices, building shared context, and maintaining the cultural elements that made remote work successful when you were smaller. What happened organically at 50 people requires deliberate effort at 500. If you’re an individual contributor, the practices that work at scale are exactly the habits worth building now—clear documentation, async-first communication, transparent collaboration. These remote work skills are transferable to any organization and compound over time.&lt;/p&gt;
&lt;aside class=&quot;my-6 rounded border-l-4 border-blue-500 bg-blue-50 p-4 text-blue-800 dark:bg-blue-900/30 dark:text-blue-200&quot; role=&quot;note&quot;&gt;
&lt;p&gt;I’ve been spending the past few years adapting these lessons into a book: &lt;a href=&quot;https://open-and-async.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Open and Async&lt;/em&gt;&lt;/a&gt;. If this post resonated with you, the book will go much deeper—covering everything from async communication patterns to leadership in distributed teams to making the case for open workflows at your organization. More to come someday!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Unlike &lt;a href=&quot;/fine-print/&quot;&gt;other content on this site&lt;/a&gt;, this post is Copyright © 2026 by Ben Balter. All rights reserved.&lt;/em&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;githubculture&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-devops&quot;&gt;
&lt;p&gt;DevOps breaks down the wall between “people who write code” and “people who deploy it” by making both responsibilities visible and shared. One implementation—ChatOps—puts deployment (and cultural) commands in chat where everyone can see them, creating a natural audit trail and enabling asynchronous collaboration. &lt;a href=&quot;#user-content-fnref-devops&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-markdown-ai&quot;&gt;
&lt;p&gt;Markdown has since become the lingua franca of AI. LLMs natively read and generate Markdown, and its lightweight syntax often uses fewer characters (and typically fewer tokens) than HTML or rich text formats, making every AI interaction more efficient. A format chosen for human collaboration turned out to be AI-native too. &lt;a href=&quot;#user-content-fnref-markdown-ai&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;&lt;/githubculture&gt;</content:encoded><author>ben@balter.com</author></item><item><title>How to run LanguageTool on macOS</title><link>https://ben.balter.com/2025/01/30/how-to-run-language-tool-open-source-grammarly-alternative-on-macos/</link><guid isPermaLink="true">https://ben.balter.com/2025/01/30/how-to-run-language-tool-open-source-grammarly-alternative-on-macos/</guid><description>Set up LanguageTool as a free, open-source Grammarly alternative that runs locally on your Mac. No subscription required.</description><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You may be familiar with grammar checking tools like Grammarly,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-grammarly&quot; id=&quot;user-content-fnref-grammarly&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; but if you’re privacy-conscious like me, you likely don’t want to send everything you type to a third-party service (or may be prohibited from doing so by your employer). Enter &lt;a href=&quot;https://languagetool.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;LanguageTool&lt;/a&gt;, a free and open-source grammar, style, and spell checker that can be run locally on your machine, so nothing you type ever leaves your computer. LanguageTool can be used with your browser, with VS Code,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-vscode&quot; id=&quot;user-content-fnref-vscode&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and with Slack and other common applications. For those looking to run LanguageTool like this, I’ve tried a number of ways, and here’s the easiest:&lt;/p&gt;
&lt;h2 id=&quot;set-up-the-local-server&quot;&gt;Set up the local server&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#set-up-the-local-server&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First you need to install the backend server, which is a Java application. You could do this manually or via Docker (trust me, I tried both with varying levels of success), but I recommend letting Homebrew do the heavy lifting for you.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-homebrew&quot; id=&quot;user-content-fnref-homebrew&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; Homebrew creates its own &lt;code&gt;languagetool-server&lt;/code&gt; executable that wraps the LanguageTool jar around the Homebrew-maintained Java runtime, saving you from having to manage a Java environment yourself. In theory, it “just works”. Here’s how to install and run it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;brew install languagetool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew services start languagetool&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will install the LanguageTool server and set it to start automatically on boot as a Homebrew-managed service. Once you have the server running, you can use LanguageTool in your browser, in Slack, VS Code, etc. Read on for how to set up each (you can pick and choose once you’ve installed the server).&lt;/p&gt;
&lt;p&gt;Note: If you’d like to test that the server is running at this point, you can run &lt;code&gt;curl --data &quot;language=en-US&amp;#x26;text=a simple test&quot; http://localhost:8081/v2/check&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;one-potential-gotcha&quot;&gt;One potential gotcha&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#one-potential-gotcha&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you previously installed the &lt;code&gt;languagetool&lt;/code&gt; cask,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-disambiguation&quot; id=&quot;user-content-fnref-disambiguation&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; or accidentally installed it first, installing the non-cask version will likely fail to set up the backend service, due to the namespace conflict. The &lt;code&gt;install&lt;/code&gt; command itself won’t fail, but you’ll see a “missing path” error in the installation output and the service will not be running. If so, here’s how to fix it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;brew uninstall languagetool --cask&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew reinstall languagetool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew services start languagetool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Optionally reinstall the frontend (see below)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;languagetool-in-your-browser-chrome-edge-firefox&quot;&gt;LanguageTool in your browser (Chrome, Edge, Firefox)&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#languagetool-in-your-browser-chrome-edge-firefox&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LanguageTool works great in your browser for any text box, Google Doc, GitHub issue, etc. Here’s how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the LanguageTool extension for your browser - &lt;a href=&quot;https://languagetool.org/chrome/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/ai-grammar-checker-para/hfjadhjooeceemgojogkhlppanjkbobc&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Edge&lt;/a&gt;, &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/languagetool/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In the extension settings, set the “API Server URL” to “Local server”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That last step is important because the extension defaults to using the public LanguageTool server, which is not the one you just installed.&lt;/p&gt;
&lt;h2 id=&quot;languagetool-in-slack-and-other-common-work-applications&quot;&gt;LanguageTool in Slack and other common work applications&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#languagetool-in-slack-and-other-common-work-applications&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LanguageTool also has a macOS-native frontend that provides support for Slack, Mail, Word, and other common work applications. Here’s how to install it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;brew install languagetool --cask&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Launch the app from the Applications folder&lt;/li&gt;
&lt;li&gt;Open the LanguageTool settings via the menubar icon (LT icon &gt; Gear icon &gt; Settings)&lt;/li&gt;
&lt;li&gt;Under “Advanced”, set the “API Server URL” to “Local server” (again, otherwise it will default to the public server)&lt;/li&gt;
&lt;li&gt;Under “Active apps”, enable LanguageTool for Slack, etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;languagetool-in-vs-code&quot;&gt;LanguageTool in VS Code&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#languagetool-in-vs-code&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=davidlday.languagetool-linter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the extension&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It just works!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;languagetool-in-safari&quot;&gt;LanguageTool in Safari&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#languagetool-in-safari&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Safari does not allow extensions to make calls from HTTPS pages to HTTP endpoints (the local server), meaning before we can use the Safari LanguageTool extension, we’ll need to set up an HTTPS proxy so that it will work on HTTPS websites. Here’s an easy way to do that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;brew install caddy&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;/opt/homebrew/etc/Caddyfile&lt;/code&gt; file with the following contents:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;localhost:8082&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;reverse_proxy :8081&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;brew services start caddy&lt;/code&gt;. Note: You will be asked to &lt;code&gt;sudo&lt;/code&gt; as Caddy creates a locally trusted certificate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a href=&quot;https://apps.apple.com/us/app/languagetool-grammar-checker/id1534275760&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the Safari extension&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the Safari extension, for “API Server URL” choose “Other server” and enter &lt;code&gt;https://localhost:8082/v2&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will set up a reverse proxy that listens on port &lt;code&gt;8082&lt;/code&gt; and forwards requests to the local LanguageTool server. If you’d like to test that the server and proxy are running, you can run &lt;code&gt;curl --data &quot;language=en-US&amp;#x26;text=a simple test&quot; https://localhost:8082/v2/check&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;n-grams&quot;&gt;N-grams&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#n-grams&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As a bonus, you can set up n-gram data sets to improve LanguageTool’s ability to detect errors with words that are often confused:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LanguageTool can make use of large n-gram data sets to detect errors with words that are often confused, like their and there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s a large download, but it’s worth it if you have the space and are going to be using LanguageTool a lot. Here’s how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://languagetool.org/download/ngram-data/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Download&lt;/a&gt; the n-gram dataset(s) for your language(s) onto your local machine and unzip them into a local n-grams directory. I recommend &lt;code&gt;~/ngrams&lt;/code&gt;, but you can install it anywhere. (Note: the data is language specific, so unzip the download to, e.g., &lt;code&gt;~/ngrams/en&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Edit &lt;code&gt;/opt/homebrew/etc/languagetool/server.properties&lt;/code&gt;, adding &lt;code&gt;languageModel=/users/benbalter/ngrams&lt;/code&gt;, replacing the path to the absolute path of where you downloaded and unzipped the n-gram data.&lt;/li&gt;
&lt;li&gt;Restart the service: &lt;code&gt;brew services restart languagetool&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you did it correctly, again, it should “just work”, but if you want to confirm, you should see a message in the logs that says &lt;code&gt;INFO: Using n-gram data from /users/benbalter/ngrams&lt;/code&gt; (or whatever path you used).&lt;/p&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#troubleshooting&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By default, LanguageTool logs live in: &lt;code&gt;/opt/homebrew/var/log/languagetool/languagetool-server.log&lt;/code&gt; and Caddy logs live in: &lt;code&gt;/opt/homebrew/var/log/caddy.log&lt;/code&gt;. If you want to see if LanguageTool is running, you can use &lt;code&gt;brew services list&lt;/code&gt;, or try one of the &lt;code&gt;cURL&lt;/code&gt; methods mentioned earlier.&lt;/p&gt;
&lt;h2 id=&quot;taking-it-a-step-further&quot;&gt;Taking it a step further&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#taking-it-a-step-further&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you &lt;em&gt;really&lt;/em&gt; want to make sure what you type doesn’t traverse the internet, you can modify your hosts file or use another method (like firewall rules or Little Snitch) to block the public LanguageTool server (&lt;code&gt;api.languagetool.org&lt;/code&gt;) at the network level. This way, if you accidentally forget to set the “API Server URL” to “Local server” in one of the clients, the request will fail, and you’ll know that the client is not using the local server.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;That’s it! You now have a powerful, privacy-respecting grammar checker that you can use in your browser, in Slack, in VS Code, and in other common work applications. Happy writing!&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-grammarly&quot;&gt;
&lt;p&gt;Nothing against Grammarly. It’s a great product. I prefer to use open source tools whenever I can. &lt;a href=&quot;#user-content-fnref-grammarly&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-vscode&quot;&gt;
&lt;p&gt;I used the VS Code extension to write this post, so I &lt;em&gt;really&lt;/em&gt; hope there aren’t any typos. &lt;a href=&quot;#user-content-fnref-vscode&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-homebrew&quot;&gt;
&lt;p&gt;If you’re not familiar with Homebrew, it’s a macOS package manager that makes it easy to install, manage, and update command-line software. If you don’t have it installed, you can do so by running the following command: &lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;&lt;/code&gt;. &lt;a href=&quot;#user-content-fnref-homebrew&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-disambiguation&quot;&gt;
&lt;p&gt;The non-cask version is the backend Java server. The cask version (by the same name) is the macOS frontend that provides a menubar icon and settings UI. &lt;a href=&quot;#user-content-fnref-disambiguation&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>The &quot;I don&apos;t like what they&apos;re saying, so they shouldn&apos;t be allowed to say it&quot; approach to crisis management</title><link>https://ben.balter.com/2024/01/08/dissenting-voices/</link><guid isPermaLink="true">https://ben.balter.com/2024/01/08/dissenting-voices/</guid><description>Silencing dissent erodes trust, invites negativity, and stifles learning. The best leaders embrace transparency instead.</description><pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every seasoned leader I’ve worked with has had to make an unpopular or controversial decision. It’s one of the hallmarks of good leadership. But almost as important as the decision itself, is how you engage with your team following the decision.&lt;/p&gt;
&lt;p&gt;It’s understandable. You spend days, weeks, maybe months agonizing over ever detail, every pro and con, every possible outcome. You’ve done your due diligence, and you’ve made the best decision you can given the situation. You’re confident in your decision, and you’re ready to move forward. Then comes the inevitable push back from your team. They have questions, concerns, and objections. They’re not happy with the decision, and they’re not shy about letting you know.&lt;/p&gt;
&lt;p&gt;It’s easy to dismiss that negativity as ignorant, personal, or a vocal minority (“you can’t please everyone”), after all, they have a fraction of the perspective you have as a leader. You might seek to “control the narrative”, by dismissing such voices as inviting negativity, undermining your authority, or asking questions that you’ve already answered, thinking its unproductive to further discuss a decision you know is final. Those are all understandable and human reactions.&lt;/p&gt;
&lt;h2 id=&quot;controlling-the-narrative-is-counterproductive&quot;&gt;”Controlling the narrative” is counterproductive&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#controlling-the-narrative-is-counterproductive&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Attempting to “control the narrative” by silencing dissent is not only ineffective, it’s also counterproductive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It erodes psychological safety&lt;/strong&gt; - When you shut down the conversation, you send a message that you don’t value the input, the perspective, or the feelings of those affected by your decision. You also signal that you have something to hide, or that you’re not confident in your own reasoning, further eroding trust.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It invites negativity&lt;/strong&gt; - When you ignore the questions, you don’t make them go away. You just push them underground, where they fester and grow. People will start to speculate, gossip, and complain. They will feel resentful, frustrated, and alienated. They will look for ways to resist, sabotage, or undermine your decision.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It stifles learning&lt;/strong&gt; - When you avoid the scrutiny, you miss an opportunity to “&lt;a href=&quot;/2022/02/16/leaders-show-their-work/&quot;&gt;show your work&lt;/a&gt;” and teach through action. An organization’s culture and values is comprised of the underlying assumptions that its members use to make decision. When decisions are transparent, you offer opportunities for the next generation of leaders to learn and grow through passive observation and lightweight participation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;caremad-is-a-good-thing&quot;&gt;”Caremad” is a good thing&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#caremad-is-a-good-thing&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Like your own reaction, your team’s reaction is equally human, and I’d argue, actually a good thing.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It means they’re engaged. It means they care. While you’re ready to move on, they just go the news, and they’re still processing. The difference between good leaders and great leaders is in the follow through. Specifically, in their willingness to engage in the &lt;em&gt;emotional labor&lt;/em&gt; of helping their team figure out how to move forward, together.&lt;/p&gt;
&lt;p&gt;That dissent isn’t disengagement or obstructionism as it may be easy to misread. Quite the opposite. They’re likely “caremad”&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; - they’re upset because they care about ensuring the best possible outcomes and are trying to figure out how to do that. The reality is, questions and dissenting voices are a sign that people care about the decision being made. They want to understand the reasoning behind it, and they want to have a say in the process. And as a leader, it’s your job to listen to those voices, take their concerns into account, and plot an &lt;em&gt;emotional&lt;/em&gt; path forward.&lt;/p&gt;
&lt;h2 id=&quot;the-alternative&quot;&gt;The alternative&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-alternative&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The best leaders I’ve worked with have always been open to dissenting voices. They’ve always been willing to listen to the other side of the argument, and to engage with it, even if they’re not willing to change their mind. The playbook is simple: be transparent, open, and accountable. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Be transparent&lt;/strong&gt; - Share the information, the data, and the evidence that informed your decision. Explain the criteria, the trade-offs, and the implications. Acknowledge the limitations, the uncertainties, and the challenges. Don’t hide, spin, or sugarcoat the facts. Be honest, clear, and consistent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be open&lt;/strong&gt; - Invite the questions, the feedback, and the dialogue. Listen to the concerns, the objections, and the suggestions. Respond with respect, empathy, and curiosity. Don’t dismiss, deflect, or rebut the views. Be receptive, humble, and collaborative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be accountable&lt;/strong&gt; - Take responsibility for your decision, your actions, and your results. Admit any mistakes, apologize, correct, and improve. Don’t blame, deny, or justify the faults. Don’t put the burden on others. Be honest, humble, and results-focused.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While some see leadership as bold and courageous decision making in the face of a difficult situation, I would argue that covering one’s ears and humming in the face of after-the-fact questions shows a lack of leadership in the moment. It’s the equivalent of saying “I would have gotten away with it if it weren’t for you mangy kids…” (for those that grow up watching Scooby-Doo and other Saturday morning “who done it” cartoons).&lt;/p&gt;
&lt;p&gt;The alternative to the “I don’t like what they’re saying so they shouldn’t be allowed to say it” approach is to embrace transparency, openness, and accountability. This means acknowledging the complexity and uncertainty of the situation, explaining the rationale and evidence behind your decision, inviting and addressing the questions and concerns of your stakeholders, and admitting and correcting any errors or shortcomings. This also means being humble and curious, listening and learning from others, and being willing to change your mind or course of action when warranted. This also means being clear and consistent, communicating often and honestly, and following through on your commitments and promises.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I’d take an engaged team that can have healthy, productive, and respectful disagreement any day over a team that’s checkout out, indifferent, or apathetic. If they don’t care enough about this thing to speak up, it’s likely that there are other, bigger things that they’re not speaking up about either. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;A portmanteau of “care” and “mad”, meaning a software developer who is passionate, enthusiastic, and diligent about their work, and who cares deeply about the quality, functionality, and impact of their code and products. A caremad developer is not satisfied with mediocrity, but strives for excellence, innovation, and continuous improvement. For example, “She’s caremad about accessibility, she always makes sure every feature is compatible with screen readers and keyboard navigation.” &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Cathedral vs Bazaar People Management</title><link>https://ben.balter.com/2023/12/08/cathedral-bazaar-management/</link><guid isPermaLink="true">https://ben.balter.com/2023/12/08/cathedral-bazaar-management/</guid><description>What if we applied open source&apos;s cathedral vs. bazaar metaphor to management? Cathedral managers control; bazaar managers empower.</description><pubDate>Fri, 08 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B0026OR3LM/?tag=benbalter07-20&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;The Cathedral and the Bazaar&lt;/a&gt; is &lt;em&gt;the&lt;/em&gt; book on open source. It contrasts closed source software development (the cathedral), where a centralized and hierarchical authority designs and builds a well-defined system, and open source development (the bazaar), where a decentralized community of contributors can browse, experiment, and collaborate within a modular and adaptable system. The book argues that the bazaar model is more effective, innovative, and resilient than the cathedral model, and in many ways, brought the ideals of the open source movement to the mainstream.&lt;/p&gt;
&lt;p&gt;I’ve written before about &lt;a href=&quot;/2023/01/10/manage-like-an-engineer/&quot;&gt;bringing software development methodology to management&lt;/a&gt;, so what if we apply this cathedral vs. bazaar metaphor to people management styles?&lt;/p&gt;
&lt;h2 id=&quot;cathedral-people-management&quot;&gt;Cathedral people management&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#cathedral-people-management&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The cathedral manager is like the architect of the cathedral. They have a clear and detailed vision of what they want to achieve, and how to get there. They plan everything in advance and assign specific roles, tasks, processes, and standards to their team. They monitor and control their team’s work, and give them precise instructions, feedback, and guidance.&lt;/p&gt;
&lt;p&gt;The cathedral style of people management is characterized by a high degree of control, direction, and standardization with problems and solutions being identified and defined in a top-down manner. Its advantage is that it can produce predictable and reliable results, especially in complex and stable environments. It can also create a much-needed sense of order, clarity, and security for members of the team, who find comfort in knowing what is expected of them and what they can expect in return.&lt;/p&gt;
&lt;p&gt;The disadvantages of the cathedral style of people management are that it can stifle creativity, speed, and innovation among knowledge workers, especially in dynamic and uncertain environments that require a lot of experimentation and adaptation. It can also create a sense of rigidity, bureaucracy, and hierarchy for the team, who may feel constrained, micromanaged, and disempowered.&lt;/p&gt;
&lt;h2 id=&quot;bazaar-people-management&quot;&gt;Bazaar people management&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#bazaar-people-management&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The bazaar manager is like the organizer of the bazaar. Leaders in this style tend to have a broad vision, a flexible plan, and a flat network of roles and responsibilities for the team. The manager acts as the facilitator, the coach, and the enabler of the team’s work, defining goals and objectives and providing guidelines, feedback, and resources, while empowering the team to define their own tasks, processes, and standards, encouraging them to explore and innovate.&lt;/p&gt;
&lt;p&gt;The bazaar style of people management is characterized by a high degree of autonomy and collaboration, with problems and solutions being identified and defined by the team. Its advantage is that it can produce innovative and resilient results, especially in dynamic and uncertain environments. It can also create a sense of freedom, empowerment, and ownership for team members, who can shape their own work, express their own voice, and pursue their own growth.&lt;/p&gt;
&lt;p&gt;At the core of the bazaar style is the belief that team members are competent, self-motivated, and capable of aided self-direction. They encourage their team to explore their interests, share their ideas, and contribute their skills to further the team’s goals. This approach can also foster a culture of openness and trust among the members of the organization, who can learn from each other, support each other, and challenge each other.&lt;/p&gt;
&lt;h2 id=&quot;diagnose-the-situation-then-pick-your-style&quot;&gt;Diagnose the situation, then pick your style&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#diagnose-the-situation-then-pick-your-style&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whether you’re a manager or an individual contributor (IC), know which style you default to—and which your manager defaults to. Your team might be a mix, or the right approach might shift depending on the scenario. That’s fine. Here’s how the two styles typically differ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By &lt;strong&gt;industry&lt;/strong&gt;—The self-direction of the bazaar model wouldn’t be a good fit for the military, given the stakes. The cathedral model’s rigidity would suffocate a fast-paced startup that needs room to experiment.&lt;/li&gt;
&lt;li&gt;By &lt;strong&gt;individual&lt;/strong&gt;—A junior engineer needs the structure and clarity the cathedral model provides—“here’s the issue, here’s the approach, and here’s an example PR to reference.” A senior engineer might chafe at that much direction, preferring freedom to find problems nobody’s filed yet and propose solutions the team hadn’t considered. Likewise, some people are less comfortable living with ambiguity, while others prefer uncertainty and the autonomy that comes with it.&lt;/li&gt;
&lt;li&gt;By &lt;strong&gt;role&lt;/strong&gt;—Outside engineering, the cathedral model fits a line cook—the recipe is well-defined and consistency is everything. The bazaar model fits chefs who value creativity and experimentation as they seek to create new dishes.&lt;/li&gt;
&lt;li&gt;By &lt;strong&gt;work environment&lt;/strong&gt;—Distributed and async teams need more bazaar-style management because you can’t watch people work. Cathedral managers achieve visibility through direct oversight—standing over someone’s shoulder, literally or figuratively. In distributed teams, transparent workflows provide that same visibility without the micromanagement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find the right balance—and be willing to switch as the situation demands. Match the management to the moment.&lt;/p&gt;
&lt;h2 id=&quot;putting-it-into-practice&quot;&gt;Putting it into practice&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#putting-it-into-practice&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;For managers:&lt;/strong&gt; Distributed teams generally thrive with bazaar-style leadership because it emphasizes autonomy and trust—exactly what you need when you can’t see people working. But be ready to shift toward the cathedral when onboarding new team members, during crises requiring rapid coordination, or when establishing standards everyone must follow. The point isn’t ideological purity; it’s flexibility. If someone’s work starts slipping, lean into more cathedral-style management and the visibility advantages of working in the open until they’re back on track.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For ICs:&lt;/strong&gt; Knowing your manager’s style helps you meet them where they are. If they lean cathedral, proactively share progress and ask clarifying questions before proceeding. If they lean bazaar, take initiative and document your decisions. Senior ICs often operate bazaar-style regardless of their manager—defining problems, proposing solutions, and bringing others along through influence rather than authority.&lt;/p&gt;
&lt;p&gt;Cathedral and bazaar aren’t personality traits—they’re management operating systems you can swap depending on the moment. For distributed teams, the default should lean bazaar (autonomy plus transparency), but knowing when to shift toward cathedral matters just as much. As a manager, ask yourself: are you building a cathedral or a bazaar? As an IC, ask yourself: do you prefer working in a cathedral or a bazaar? And most importantly—are you and your manager on the same page? Get the balance right, and your team ships better work with less friction.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>How to communicate like a GitHub engineer</title><link>https://ben.balter.com/2023/10/04/how-to-communicate-like-a-github-engineer/</link><guid isPermaLink="true">https://ben.balter.com/2023/10/04/how-to-communicate-like-a-github-engineer/</guid><description>How GitHub turned its guiding communication principles into prescriptive practices to manage internal signal-to-noise ratio.</description><pubDate>Wed, 04 Oct 2023 00:00:00 GMT</pubDate><content:encoded/><author>ben@balter.com</author></item><item><title>Transparent collaboration is the andon of knowledge work</title><link>https://ben.balter.com/2023/08/30/transparency-collaboration-is-the-andon-of-knowledge-production/</link><guid isPermaLink="true">https://ben.balter.com/2023/08/30/transparency-collaboration-is-the-andon-of-knowledge-production/</guid><description>Like Toyota&apos;s andon cord, transparent collaboration lets anyone stop the line when they spot a problem in knowledge work.</description><pubDate>Wed, 30 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The shift from waterfall to agile was predicated on the belief that what worked for the factory floor during the Industrial Revolution would not work for knowledge work in the Information Age, but assembly lines and modern software development have more in common than you might think:&lt;/p&gt;
&lt;p&gt;Agile development can trace its roots back to the production floor of Toyota as far back as the 40s and 50s. At the core of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Toyota_Production_System&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Toyota Production System&lt;/a&gt; (what eventually inspired the &lt;a href=&quot;https://en.wikipedia.org/wiki/Lean_manufacturing&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;lean manufacturing&lt;/a&gt; movement) was the concept of an &lt;a href=&quot;https://en.wikipedia.org/wiki/Andon_(manufacturing)&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;andon&lt;/a&gt;, a concept we continue to see driving benefit in modern software development today.&lt;/p&gt;
&lt;h2 id=&quot;anyone-can-stop-the-line-for-any-reason&quot;&gt;Anyone can stop the line for any reason&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#anyone-can-stop-the-line-for-any-reason&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In short, an andon is a system of lights and signals that allows workers to alert managers and colleagues to any problems or defects in the production process. With the pull of a cord or the press of a button at each station by any worker, the entire production system grinds to an instant halt. It may seem counterintuitive to make it easier for &lt;em&gt;anyone&lt;/em&gt; to shut down production, but the idea is that if you stop the line as soon as a problem is detected, it can be fixed before it gets worse. It’s been so successful in driving continuous improvement that Toyota (and most other manufacturers) continue to use the concept to this day.&lt;/p&gt;
&lt;p&gt;The andon is designed to empower workers to stop the line, identify the root cause of the issue, and implement corrective actions, rather than letting it pass unnoticed or hoping someone else will fix it later. The andon is not only a tool for quality control, but also a culture of continuous improvement, where everyone is encouraged to speak up, share feedback, and collaborate on solutions. The andon fosters a sense of ownership, accountability, and learning among the workers, as well as transparency, trust, and alignment among the managers.&lt;/p&gt;
&lt;h2 id=&quot;transparency-is-software-developments-andon&quot;&gt;Transparency is software development’s andon&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#transparency-is-software-developments-andon&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Transparent collaboration in software development and other knowledge work is like the andon in a production system. It allows anyone to spot and call out critical issues early on, before they get worse, and to engage in constructive dialogue and problem-solving with their peers and stakeholders. Some of the benefits of transparent collaboration are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster and better feedback loops&lt;/strong&gt; - By making the work visible and accessible to everyone, transparent collaboration enables faster and more frequent feedback from users, customers, and colleagues. This feedback can help validate assumptions, identify gaps, and improve the quality and usability of the product or service. It can also help prevent misunderstandings, conflicts, and rework, as well as foster a culture of experimentation and learning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Higher engagement and motivation&lt;/strong&gt; - By giving everyone a voice and a stake in the work, transparent collaboration increases the engagement and motivation of the workers. It allows them to express their ideas, opinions, and concerns, and to contribute to the decision-making and problem-solving processes. It also allows them to see the value and impact of their work, and to receive recognition and appreciation from their peers and managers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Greater trust and alignment&lt;/strong&gt; - By creating a shared understanding and a common goal, transparent collaboration builds trust and alignment among the workers and the managers. It reduces the barriers and silos that can hinder communication, collaboration, and coordination. It also promotes a culture of honesty, openness, and accountability, where everyone is responsible for the quality and outcome of the work, and where everyone can learn from mistakes and successes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Higher quality and customer satisfaction&lt;/strong&gt; - By spotting and solving critical issues early on, you can prevent or reduce defects, errors, and rework, and improve the quality and usability of your software. By seeking and providing feedback throughout the process, you can ensure that your software meets the needs and expectations of your users and customers, and delivers value to them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster and more efficient delivery&lt;/strong&gt; - By making your work visible and accessible, you can reduce the overhead and waste of information silos, duplication, and handoffs, and streamline the software development process. By stopping the line and escalating issues when necessary, you can avoid or minimize delays, disruptions, and dependencies, and speed up the software delivery cycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, transparent collaboration is not without its challenges and trade-offs. It requires a shift in mindset, behavior, and culture, as well as a set of tools, processes, and norms that support and enable it. It also requires a balance between openness and privacy, between collaboration and autonomy, and between feedback and focus.&lt;/p&gt;
&lt;h2 id=&quot;applying-the-andon-principle-to-software-development&quot;&gt;Applying the andon principle to software development&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#applying-the-andon-principle-to-software-development&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The benefits of transparent collaboration outweigh the costs, especially in a complex, uncertain, and dynamic environment, where the ability to adapt, innovate, and deliver value is essential. By adopting the andon principle in your own work, you can leverage the collective intelligence, creativity, and experience of your teams, and create better products and services for your users and customers. Here are some ways you can apply the andon principle to your software development team:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make your work visible and accessible&lt;/strong&gt; - Lean into transparency. Don’t view openness and early, broad engagement as a potential liability or risk that someone might “shoot down” your idea, but as an opportunity to get feedback and improve your work. Use tools and processes that allow you to share your work with your team and your stakeholders, and to solicit and incorporate their feedback. Don’t wait until the end of the project or the release cycle to get feedback. Instead, seek and provide feedback throughout the software development process, from ideation to deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop the line and escalate issues when necessary&lt;/strong&gt; - Don’t ignore or hide problems, or hope that someone else will fix them. Be proactive and responsible for the quality and outcome of your work. If you encounter a critical issue, such as a bug, a security issue, a performance degradation, or a user complaint, stop what you’re doing and alert your team and your stakeholders. Don’t resume your work until the issue is fixed, or a mitigation plan is in place. Learn from the issue, and implement preventive or corrective actions to avoid or reduce its recurrence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seek and provide feedback early and often&lt;/strong&gt; - Don’t wait until the end of the project or the release cycle to get feedback from your users, customers, and colleagues. Solicit and incorporate feedback throughout the software development process, from ideation to deployment. Use techniques such as user research, prototyping, testing, and experimentation to validate your assumptions, identify gaps, and improve your software. Be open and receptive to feedback, and use it to learn and improve, not to blame or defend. Give constructive and timely feedback to others, and appreciate and acknowledge their contributions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaborate and problem-solve with your team and your stakeholders&lt;/strong&gt; - Don’t work in isolation, or assume that you have all the answers. Leverage the collective intelligence, creativity, and experience of your team and your stakeholders. Involve them in the decision-making and problem-solving processes, and respect their perspectives and inputs. Use methods such as brainstorming, design thinking, and retrospectives to generate and evaluate ideas, and to identify and address root causes. Communicate clearly and effectively, and align on the goals, expectations, and roles. Celebrate and share your successes, and learn from your failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a culture of continuous improvement&lt;/strong&gt; - Don’t settle for the status quo, or assume that there’s nothing you can do to improve. Continuously reflect on your work, and look for ways to make it better. Use tools and processes such as retrospectives, postmortems, and root cause analysis to identify and address issues, and to implement preventive or corrective actions. Encourage and reward experimentation, learning, and innovation. Be open to change, and embrace new ideas and approaches. Don’t be afraid to fail, and learn from your mistakes. Share your learnings with others, and help them improve.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Software development is not the same as manufacturing, but it shares some similarities. Both are complex, iterative, and collaborative processes that involve creating and delivering value to customers. Both also face challenges such as quality, efficiency, and innovation. And both can benefit from the andon principle.&lt;/p&gt;
&lt;p&gt;The andon principle is not a silver bullet, but it’s a powerful tool for spotting and solving critical issues early on, and for fostering a culture of collaboration in your software development team. By adopting the andon principle, you can empower yourself and your team to stop the line when necessary, to collaborate and problem-solve with your peers and stakeholders, and to create better products and services for your users and customers. So, next time you encounter an issue in your software development process, don’t hesitate to pull the andon cord. Your team and your customers will thank you for it.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Remote work requires communicating more, less frequently</title><link>https://ben.balter.com/2023/08/04/remote-work-communicate-more-with-less/</link><guid isPermaLink="true">https://ben.balter.com/2023/08/04/remote-work-communicate-more-with-less/</guid><description>Async communication is like gzip compression for humans—more upfront processing, but greater throughput with fewer packets.</description><pubDate>Fri, 04 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Remote work is not simply a matter of replicating the office environment online. One of the key shifts that remote workers need to make is to communicate &lt;em&gt;more&lt;/em&gt;, less &lt;em&gt;often&lt;/em&gt;. Instead of relying on constant, synchronous, and often interrupt-driven interactions, remote workers embrace asynchronous, and often higher-fidelity, forms of communication, such as long-form writing or thoughtful videos.&lt;/p&gt;
&lt;p&gt;I’ve &lt;a href=&quot;/2022/03/17/why-async/#benefits-of-working-asynchronously&quot;&gt;written before&lt;/a&gt; about the benefits of working asynchronously, but less obviously, it also changes the &lt;em&gt;way&lt;/em&gt; we think and work. Async work allows for more reflection, research, and synthesis. Those working async can and should take the time to think, learn, and synthesize before sharing their ideas, opinions, or solutions, distilling them down to the most critical. This improves the quality and clarity of the communication, and most importantly, the overall throughput of the communications channel.&lt;/p&gt;
&lt;p&gt;Think of it like gzip compression, but for human-to-human communication. Yes, there’s slightly more processing overhead at the start, but it allows greater communications throughput using fewer “packets” (communicate more using less).&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; How can you communicate more, less often? Here are a few tips I often keep in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Choose the right medium for the message&lt;/strong&gt; - Remote workers should use the most appropriate and effective form of communication for the purpose, audience, and context. For example, use writing for documenting, explaining, or persuading; use video for demonstrating, teaching, or storytelling; use chat for coordinating, clarifying, or socializing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write clearly, concisely, and comprehensively&lt;/strong&gt; - Remote workers should write with the reader in mind, using simple language, short sentences, and clear structure. They should also provide enough detail, context, and evidence to support their points, answer potential questions, and avoid ambiguity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record videos with empathy, enthusiasm, and engagement&lt;/strong&gt; - Remote workers should record videos with a human touch, using eye contact, facial expressions, and voice modulation. They should also keep their videos short, focused, and interactive, using visuals, examples, and questions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communicate proactively, regularly, and asynchronously&lt;/strong&gt; - Remote workers should communicate their goals, plans, and updates without waiting for prompts, requests, or deadlines. They should also communicate their availability, boundaries, and preferences without assuming or imposing. They should communicate asynchronously as much as possible, using synchronous communication only for urgent, complex, or sensitive matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remote work requires communicating more, less often, because asynchronous communication involves less frequent, but richer communication, meaning there is less time talking &lt;em&gt;about&lt;/em&gt; the work and more time &lt;em&gt;doing&lt;/em&gt; it, allowing the system to optimize for throughput and flow.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Not to mention, thoughtful, written communication helps ideas to scale more effectively (there’s a reason the printing press spurred the Renaissance). It shifts communication from a one-to-one relationship to a one-to-many. Next time you’re about to “send a quick DM” or “schedule a quick chat,” consider what steps you could take to optimize for the long tail of information retrieval and discovery. Just like building a web app, “writes” are expensive, but “reads” should be “cheap,” so avoid introducing mental N+1s into the system whenever possible. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Practice inclusive scheduling</title><link>https://ben.balter.com/2023/05/19/practice-inclusive-scheduling/</link><guid isPermaLink="true">https://ben.balter.com/2023/05/19/practice-inclusive-scheduling/</guid><description>Small scheduling choices — writing dates unambiguously, including time zones, and building in breaks — make distributed teams feel included.</description><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Time zones are one of the harder parts of software development, but it doesn’t have to be one of the harder (or exclusionary) parts of working as a distributed team. Here are a few practices that I try to adhere to help practice more inclusive scheduling when working remotely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When discussing dates, consider writing numeric dates in &lt;a href=&quot;https://en.wikipedia.org/wiki/ISO_8601&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;ISO 8601&lt;/a&gt; (YYYY-MM-DD) or other month/day unambiguous formats.&lt;/li&gt;
&lt;li&gt;When referring to a time, always include the timezone.&lt;/li&gt;
&lt;li&gt;Avoid location-specific language like “tomorrow”, “this afternoon”, or “in the spring”.&lt;/li&gt;
&lt;li&gt;Be mindful of holidays, weekends, and working hours, especially across time zones.&lt;/li&gt;
&lt;li&gt;Consider “speedy meetings” (end 5/10 minutes early or start 5/10 minutes late) to allow for time to be human between meetings, and be strict about ending at that earlier time.&lt;/li&gt;
&lt;li&gt;On that note, meetings should start and end on time. If you finish early, consider using the remainder of the time for informal conversations and to connect as humans.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://xkcd.com/1179/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/iso_8601_2x.png&quot; alt=&quot;xkcd comic describing ISO 8601 as the one true date format&quot; loading=&quot;eager&quot; decoding=&quot;auto&quot; fetchpriority=&quot;high&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A small nod to inclusively to go a long way to create a sense of belonging and reduce ambiguity, when working with global teams, schedule and communicate with a global (and remote) audience in mind.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Pull requests are a form of documentation</title><link>https://ben.balter.com/2023/05/19/pull-requests-are-a-form-of-documentations/</link><guid isPermaLink="true">https://ben.balter.com/2023/05/19/pull-requests-are-a-form-of-documentations/</guid><description>Pull requests capture not just what changed, but who, why, and what alternatives were considered. Treat every PR as a time capsule for future contributors.</description><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We often think of pull requests purely as a code review mechanism, but they are also an organic and natural form of documentation. I can’t count the number of times I’ve spelunked historic GitHub PRs to understand the context around a feature or product decision.&lt;/p&gt;
&lt;p&gt;Pull requests capture not just what change was made, but who made it, why, and what alternatives were considered. They create a cross-linked web of context for others, and capture the discussion &lt;em&gt;around&lt;/em&gt; the change, which is often an equally valuable technical artifact.&lt;/p&gt;
&lt;p&gt;When I write a PR, I write it not just with the immediate reviewers in mind, but how it will read for outsiders down the line who might land on in from search results or a cross reference. Beyond documentation, PRs are a great place for your colleagues to ask the type of “dumb questions” that gives you the confidence to ship.&lt;/p&gt;
&lt;p&gt;To that end, here are a few practices I follow when authoring pull requests to ensure I’m capturing sufficient context for myself and future contributors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Descriptive title&lt;/strong&gt; - Avoid the default &lt;code&gt;Update FILE.md&lt;/code&gt; and instead use the title to capture the essence of the change in a way that is clear when scanning a list of PRs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brief description of the change&lt;/strong&gt; - Right up front, add a quick TL;DR describing the “what” of the change for others landing on the PR from search or a cross link so that they can quickly understand the change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ensure the body describes the “why”&lt;/strong&gt; - Equally essential as the “what” is the “why”. Why is this change being made? What problem does it solve? What alternatives were considered? What are the trade-offs? What are the risks? Be sure to include relevant links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enough context&lt;/strong&gt; - So that others outside your team (or yourself years from now) can understand the change. Think of it as a time capsule or a message in a bottle to your future self and future contributors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@mention responsible team&lt;/strong&gt; - if not automatically requested via &lt;code&gt;CODEOWNERS&lt;/code&gt;. Not only does this bring visibility to the PR, it also makes ownership clear by explicitly calling out the responsible team. Be sure to include why you’re @mentioning the team (what action is requested, if any) so that it’s surfaced in the notification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CC or &lt;a href=&quot;https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;fixes&lt;/code&gt;&lt;/a&gt; related issues&lt;/strong&gt; - to create a trail of breadcrumbs to improve discoverability and allow others to opt-in to additional context. As an added bonus, it will auto close the tracking issue for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task lists&lt;/strong&gt; - To reflect the current state of the PR - for example &lt;code&gt;TODO: add tests&lt;/code&gt; and to capture process&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screenshots or animated GIFs&lt;/strong&gt; - to illustrate UI changes without requiring other to spin up a dev environment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In-line documentation&lt;/strong&gt; - Linking back to the PR from the code itself for especially complex or nuanced changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review your own PR&lt;/strong&gt; - Comment in line to highlight specific changes for reviewers that you’re less confident on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discrete changes&lt;/strong&gt; - Avoid bundling unrelated changes into a single PR which can hinder future discovery and understanding. Bonus use atomic, descriptive commits within the PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, organic documentation takes slightly more time, but it’s less overhead than keeping static documentation up to date, and I promise you, it’s well worth it - your future self (and future coworkers) will thank you.&lt;/p&gt;
&lt;p&gt;For even more tips, check out &lt;a href=&quot;https://github.blog/2015-01-21-how-to-write-the-perfect-pull-request/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;how to write the perfect pull request&lt;/a&gt; on the GitHub Blog.&lt;/p&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Meetings are a point of escalation, not a starting point</title><link>https://ben.balter.com/2023/04/20/meetings-are-a-point-of-escalation/</link><guid isPermaLink="true">https://ben.balter.com/2023/04/20/meetings-are-a-point-of-escalation/</guid><description>Most meetings are just information downloads that could&apos;ve been a doc. Treat them as an escalation based on complexity, not the default starting point.</description><pubDate>Thu, 20 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Asynchronous communication (Issues, PRs, Google Docs, and sometimes Slack) should be the default, reserving more synchronous media (like video calls and in-person meetings) for the types of conversations that uniquely benefit from their higher fidelity (brainstorming, whiteboarding, interpersonal conflict, social connection, etc.). Put another way, the phrase “async first” should be taken literally.&lt;/p&gt;
&lt;h2 id=&quot;default-to-transferring-context-asynchronously&quot;&gt;Default to transferring context asynchronously&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#default-to-transferring-context-asynchronously&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When starting up a new initiative or collaborating with a colleague for the first time, it’s often tempting to “throw some time on their calendar” to “kick things off”. Such kickoff meetings often consist primarily of an information download, sharing context from one coworker to another with a specific call to action or request for feedback. But information transfer isn’t always the best use of synchronous time, especially when you consider the overhead of scheduling (especially across time zones), scaling (O(n) vs O(1)), and memorializing outcomes (as durable artifacts available to others). Not to mention, different people have different learning styles—not everyone absorbs information best via voice and in real time.&lt;/p&gt;
&lt;p&gt;Instead, next time, consider transferring that context asynchronously (as a GitHub issue or Google Doc, for example), and then scheduling a meeting only if the conversation requires it—you’d be surprised how often it does not. A few minutes of reading or a few comments on an issue or Google Doc can often replace waiting days for mutual availability and a dedicated 30-minute block of time. In this sense, you can think of meetings as a point of &lt;em&gt;escalation&lt;/em&gt; based on complexity, not as the default starting point for a workstream, initiative, or conversation.&lt;/p&gt;
&lt;h2 id=&quot;meetings-are-not-where-work-happens&quot;&gt;Meetings are &lt;em&gt;not&lt;/em&gt; where work happens&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#meetings-are-not-where-work-happens&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You may be skeptical. I was curious, so &lt;a href=&quot;https://github.com/benbalter/gmail-and-google-calendar-stats&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;I wrote a quick script to pull stats from my own calendar&lt;/a&gt;. My first year at GitHub (2013), I had a grand total of &lt;strong&gt;16&lt;/strong&gt; internal meetings. Yes, we were smaller back then, but we were also &lt;em&gt;dogmatic&lt;/em&gt; about being async first, almost to a fault. As we grew, my second year I had 43 meetings, and things gradually increased from there. This year, I’m on track to have over &lt;strong&gt;600&lt;/strong&gt; meetings. There’s got to be a better way!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/282759/233466397-ff9737ce-7b51-45c1-a643-88a00bbce4cf.png&quot; alt=&quot;meetings-over-time&quot; loading=&quot;eager&quot; decoding=&quot;auto&quot; fetchpriority=&quot;high&quot;&gt;&lt;figcaption&gt;meetings-over-time&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;/2022/03/17/why-async/#benefits-of-working-asynchronously&quot;&gt;Working asynchronously by default&lt;/a&gt; fosters a more inclusive culture, facilitates discoverability and permanence, creates space for learning, allows for greater work-life balance, and produces better outcomes, faster. Async is also the key to making remote work, work.&lt;/p&gt;
&lt;h3 id=&quot;hold-colleagues-accountable-for-being-truly-async-first&quot;&gt;Hold colleagues accountable for being truly async first&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#hold-colleagues-accountable-for-being-truly-async-first&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you receive a meeting invite (or if a colleague requests permission to send you a meeting invite) without context, an agenda, or a read-ahead doc, consider politely declining, or at least asking for one—it’s well within your rights (you can even link to this discussion post as a “get out of &lt;del&gt;jail&lt;/del&gt; meeting free” card). After all, if the person requesting the meeting hasn’t taken the time to distill their thoughts into writing, why should they be able to decide how you spend your own time?&lt;/p&gt;
&lt;githubculture&gt;&lt;/githubculture&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Intro to GitHub for non-technical roles</title><link>https://ben.balter.com/2023/03/02/github-for-non-technical-roles/</link><guid isPermaLink="true">https://ben.balter.com/2023/03/02/github-for-non-technical-roles/</guid><description>GitHub isn&apos;t just for developers. A practical guide for non-technical roles to follow along, collaborate, and track work with confidence.</description><pubDate>Thu, 02 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-github&quot;&gt;What is GitHub?&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-is-github&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’re not a software developer, you can think of GitHub like Dropbox, Google Drive, or SharePoint, but for software development. It’s primarily used by software developers to collaborate on software and track their progress, but can be used by anyone involved in the software development process.&lt;/p&gt;
&lt;h2 id=&quot;repositories&quot;&gt;Repositories&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#repositories&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/repositories&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Repositories&lt;/a&gt; are the most basic unit of GitHub. Each repository represents a real-world project, initiative, or team. Repositories contain issues, discussions, and pull requests (more on that in a moment), as well as “code”, which for non-technical roles, is often text files in the form of Markdown (more on that too).&lt;/p&gt;
&lt;h2 id=&quot;markdown&quot;&gt;Markdown&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#markdown&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Markdown is how text is formatted on GitHub. If you wanted to format text in a text box that didn’t support formatting, you might use &lt;code&gt;*&lt;/code&gt;s to represent bullets, or wrap a word in &lt;code&gt;_&lt;/code&gt; to emphasize it. That’s Markdown. Markdown is plain text, with optional lightweight formatting that GitHub can render. It sounds like “coding”, but you’ll get the hang of it in no time. To get started, check out &lt;a href=&quot;https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the official GitHub docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pro-tip: To convert a Word or Google Doc to Markdown, you can use my very own &lt;a href=&quot;https://word2md.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Word to Markdown converter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;issues&quot;&gt;Issues&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#issues&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Issues&lt;/a&gt; are how work is tracked on GitHub. You can think of them as “To Do” items (or “tickets” in some contexts). Issues describe the &lt;em&gt;problems&lt;/em&gt; you or your team want to solve, with the list of potential problems being referred to as the team’s “issue backlog”. You can comment on issues, like you would a blog post, assign them to people, and close them when they have been completed. Issues can also be labeled for ease of discoverability and for tracking additional metadata. For especially complex problems, the body of the issue can even include a task list with checkboxes, to track progress of individual sub-tasks.&lt;/p&gt;
&lt;h2 id=&quot;discussions&quot;&gt;Discussions&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#discussions&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discussions&lt;/a&gt; are like issues, but don’t have a specific outcome or sense of state (open or closed). You can use discussions to ask questions, collaborate on ideas, and share announcements. You can think of discussions like blog posts, an online forum, or a chat room for your repository.&lt;/p&gt;
&lt;h2 id=&quot;pull-requests&quot;&gt;Pull requests&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#pull-requests&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Pull requests&lt;/a&gt; are how you propose changes to a repository. If issues describe the problems, pull requests describe the proposed &lt;em&gt;solutions&lt;/em&gt;. Others can also review your proposed changes and comment on, make suggested changes to, or “approve” your pull request. Pull requests modify files within the repository. Once approved, your pull request is “merged” into the repository and your proposed changes are “live”.&lt;/p&gt;
&lt;h2 id=&quot;markdown-files&quot;&gt;Markdown files&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#markdown-files&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Repositories contain files. These files can be anything, but are often text files in the form of Markdown. You can edit these files directly on GitHub, or you can clone the repository to your computer and edit them there (more on that below). You can also upload files directly to GitHub by dragging-and-dropping them. Generally filenames are lower case and use hyphens instead of spaces. Files as Markdown is generally how long-lived information is shared and stored (documentation, policy, procedures, etc.).&lt;/p&gt;
&lt;h2 id=&quot;tracking-changes&quot;&gt;Tracking changes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#tracking-changes&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At the core of GitHub is a version control system called Git. Git tracks changes to files over time. You can think of it like tracked changes in Google Docs or Microsoft Word (or if you’re into sci-fi, a time machine for your files). You can see who made changes, when they were made, and what the changes were. You can also “roll back” changes to a previous version of a file.&lt;/p&gt;
&lt;h2 id=&quot;commits&quot;&gt;Commits&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#commits&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Git tracks changes as “&lt;a href=&quot;https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;commits&lt;/a&gt;”. A commit is a snapshot of the file (or files) at a point in time. Each commit should have a brief, descriptive message describing the changes from the previous version, to help you and your colleagues understand what’s going on.&lt;/p&gt;
&lt;h2 id=&quot;branches&quot;&gt;Branches&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#branches&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Branches&lt;/a&gt; are like parallel universes or alternate timelines for your files. You can make changes to a branch without affecting files on the “main” branch. Branches contain one or more commits, and when you’re ready, you can merge your changes (commits) into the main branch to update the files there. You can think of branches as saving a copy of a file so that you can work on changes without affecting others’ work, but in a way that makes it easier to merge any changes you make back in with the original when you’re ready.&lt;/p&gt;
&lt;h2 id=&quot;github-flow&quot;&gt;GitHub flow&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#github-flow&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/get-started/quickstart/github-flow&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub flow&lt;/a&gt; describes the process of making changes to a repository. The basic steps are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open an issue describing the problem you want to solve&lt;/li&gt;
&lt;li&gt;Once there is agreement that the problem should be solved, decide on the best solution&lt;/li&gt;
&lt;li&gt;Create a branch to work on the solution&lt;/li&gt;
&lt;li&gt;Make changes to files on the branch&lt;/li&gt;
&lt;li&gt;Commit those changes&lt;/li&gt;
&lt;li&gt;Open a pull request “requesting” that those changes be merged back into the “main” branch&lt;/li&gt;
&lt;li&gt;Your colleagues review your pull request and either approve it or suggest changes&lt;/li&gt;
&lt;li&gt;Once approved, your pull request is “merged” and your changes are now “live” on the main branch&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notifications&quot;&gt;Notifications&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#notifications&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub sends &lt;a href=&quot;https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/about-notifications&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;notifications&lt;/a&gt; to you when someone mentions you in a comment, assigns you to an issue, or requests your review on a pull request. You can also (and often should) “subscribe” to repositories to be notified about some or all activity. Likewise, you can unsubscribe from individual issues if you’re not interested. By default you’ll receive notifications via email, but you can also configure GitHub to use “web notifications”, or even set up notifications in your Slack or Teams channel.&lt;/p&gt;
&lt;h2 id=&quot;mentions&quot;&gt;@mentions&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#mentions&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the most powerful GitHub features is @mentions. You can tag anyone into an issue or pull request by typing &lt;code&gt;@&lt;/code&gt; followed by their GitHub login. They’ll receive a notification and can respond. You can also use @mentions to tag teams, like &lt;code&gt;@github/eng&lt;/code&gt; or &lt;code&gt;@github/eng-ops&lt;/code&gt;. When @mentioning users or teams, it’s best to provide context in the comment so they know why they are receiving the notification.&lt;/p&gt;
&lt;h2 id=&quot;cross-references&quot;&gt;Cross references&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#cross-references&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another powerful GitHub feature is issue and pull request &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;cross references&lt;/a&gt;. You can reference another issue or pull request in a comment by including its number (for example, &lt;code&gt;This is related to #123&lt;/code&gt;). When cross referenced, links are created between the two issues or pull requests, making it easier for others to discover and understand the context of the conversation.&lt;/p&gt;
&lt;h2 id=&quot;desktop-vs-web&quot;&gt;Desktop vs. web&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#desktop-vs-web&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Almost everything you’d want to do on GitHub you can do entirely through the web interface. You can view, create, edit, or delete files, browse and comment on issues, and merge pull requests. If you’d prefer to work on your desktop using your favorite desktop software, you can install &lt;a href=&quot;https://desktop.github.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Desktop&lt;/a&gt;. GitHub Desktop provides a visual interface for “pulling” (downloading) repositories onto your computer and interacting with GitHub.&lt;/p&gt;
&lt;h2 id=&quot;advanced-ish-topics&quot;&gt;Advanced-ish topics&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#advanced-ish-topics&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;pushing-and-pulling&quot;&gt;Pushing and pulling&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#pushing-and-pulling&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you’re using the web interface, you don’t have to worry about pushing or pulling. If you’re using the desktop client, you can think of pulling as downloading the files from GitHub and pushing as uploading the files back to GitHub. (Before pulling, you need to clone, or create a copy of, the files.)&lt;/p&gt;
&lt;h3 id=&quot;emoji-and-animated-gifs-&quot;&gt;Emoji and animated GIFs &lt;span role=&quot;img&quot; aria-label=&quot;party popper&quot;&gt;🎉&lt;/span&gt;&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#emoji-and-animated-gifs-&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In addition to Markdown you’ll often see emoji and animated GIFs used heavily on issues and pull requests. You can think of emoji and animated GIFs as the facial expressions and body language of GitHub. They make it easier to convey emotion in written text. I like to describe the communication style on GitHub as “professional but informal”, meaning don’t be afraid to use emoji and animated GIFs to make your comments more expressive (while remaining appropriate, of course).&lt;/p&gt;
&lt;h2 id=&quot;project-boards&quot;&gt;Project boards&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#project-boards&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If individual tasks are tracked as issues, &lt;a href=&quot;https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;project boards&lt;/a&gt; are how you track the progress of a project as a whole. Project boards are a visual representation of what issues are on deck, what issues are in progress, and what issues have been completed (todo, doing, done).&lt;/p&gt;
&lt;h2 id=&quot;finding-information&quot;&gt;Finding information&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#finding-information&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With so much information available on GitHub, it’s often intimidating to find what you’re looking for. Here are some tips for using &lt;a href=&quot;https://github.com/search&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub’s powerful search&lt;/a&gt; to find anything on GitHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use keyword search, just like you would any search engine. For example, searching for &lt;code&gt;widgets&lt;/code&gt; will find all repositories, issues, pull requests, and discussions that contain the word “widgets”.&lt;/li&gt;
&lt;li&gt;Scope your search to an organization or repository by using the &lt;code&gt;org:&lt;/code&gt; or &lt;code&gt;repo:&lt;/code&gt; qualifiers. For example, &lt;code&gt;org:github&lt;/code&gt; will find all issues in all repositories in the &lt;code&gt;github&lt;/code&gt; organization, or &lt;code&gt;repo:github/docs&lt;/code&gt; will find all issues in the &lt;code&gt;github/docs&lt;/code&gt; repository.&lt;/li&gt;
&lt;li&gt;You can further refine your search to only show threads that you’re involved in by using the &lt;code&gt;involves:@me&lt;/code&gt; modifier. For example, &lt;code&gt;widgets involves:@me&lt;/code&gt; will find all issues, pull requests, and discussions that contain the word “widgets” and that you are involved in.&lt;/li&gt;
&lt;li&gt;Different types of information (issues, pull requests, discussions, Markdown) are displayed as separate results. Be sure to check the side bar to see all the different types of information that match your search.&lt;/li&gt;
&lt;li&gt;You can limit a “code” search to only Markdown files, by clicking “Markdown” in the sidebar to filter results, or adding &lt;code&gt;language:Markdown&lt;/code&gt; to your search query.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/search-github/github-code-search/using-github-code-search&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Official docs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;checks&quot;&gt;Checks&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#checks&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You &lt;em&gt;may&lt;/em&gt; see one or more &lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;status checks&lt;/a&gt; on your pull request. Checks are automated tests that run against your proposed changes to enforce certain rules (such as formatting, spelling, or style). If a check fails, you’ll need to fix the problem before your pull request can be merged. You can click “details” next to a failed check to learn more.&lt;/p&gt;
&lt;h3 id=&quot;when-to-use-an-issue-vs-a-pull-request-vs-a-discussion-vs-a-markdown-file-vs-a-project-board&quot;&gt;When to use an issue vs. a pull request vs. a discussion vs. a Markdown file vs. a project board&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#when-to-use-an-issue-vs-a-pull-request-vs-a-discussion-vs-a-markdown-file-vs-a-project-board&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Project work generally flows in this order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discussions - Open-ended conversation without a specific outcome or concept of “done”. This is often the ideation or brainstorming stage.&lt;/li&gt;
&lt;li&gt;Issues - How problems are tracked, discussed, and prioritized.&lt;/li&gt;
&lt;li&gt;Pull requests - How solutions/changes are proposed and reviewed. Generally pull requests should tie back to the issue/problem they are solving.&lt;/li&gt;
&lt;li&gt;Markdown files - How long-lived information is shared and stored (documentation, policy, procedures, etc.). Markdown files are changed via pull request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a project proceeds in one or more repositories, high-level project progress is tracked on one or more project boards (which visually organizes the state of multiple issues).&lt;/p&gt;
&lt;h2 id=&quot;putting-it-all-together-editing-a-file-on-the-web&quot;&gt;Putting it all together, editing a file on the web&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#putting-it-all-together-editing-a-file-on-the-web&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open the repository you want to edit&lt;/li&gt;
&lt;li&gt;Navigate to the file you want to edit&lt;/li&gt;
&lt;li&gt;Click the pencil icon to edit the file&lt;/li&gt;
&lt;li&gt;Make your changes&lt;/li&gt;
&lt;li&gt;Click “Commit changes” to save your changes&lt;/li&gt;
&lt;li&gt;Describe your changes in the commit message&lt;/li&gt;
&lt;li&gt;Name your branch&lt;/li&gt;
&lt;li&gt;Click “Propose changes” to open a pull request&lt;/li&gt;
&lt;li&gt;Describe your changes in the pull request, ideally referencing the issue you’re solving (for example, &lt;code&gt;Closes #123&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Your colleagues review your pull request and either approve it or suggest changes&lt;/li&gt;
&lt;li&gt;Once approved and checks pass, your pull request is “merged” and your changes are now “live” on the main branch&lt;/li&gt;
&lt;li&gt;Celebrate your first contribution to GitHub!&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;glossary&quot;&gt;Glossary&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#glossary&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you come across a term or concept not covered here, be sure to check out &lt;a href=&quot;https://docs.github.com/en/get-started/quickstart/github-glossary&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the official GitHub glossary&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Happy GitHubbing! &lt;span role=&quot;img&quot; aria-label=&quot;party popper&quot;&gt;🎉&lt;/span&gt;&lt;/p&gt;
&lt;githubculture&gt;&lt;/githubculture&gt;</content:encoded><author>ben@balter.com</author></item><item><title>How to write a great extended leave document</title><link>https://ben.balter.com/2023/01/13/great-extended-leave-documents/</link><guid isPermaLink="true">https://ben.balter.com/2023/01/13/great-extended-leave-documents/</guid><description>A battle-tested template for handing off your responsibilities before extended leave, so your team stays unblocked and nothing falls through the cracks.</description><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently came back from an extended leave to find several of my colleagues asking to copy my “leave doc” for their own planned leaves. Having transitioned roles within GitHub now a number of times over the years, I’m no stranger to temporarily or permanently handing off work, and have evolved a preferred format I use to ensure business continuity during the transition. In service of &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;“everything should have a URL”&lt;/a&gt;, I’m sharing my leave template here in case it’s helpful for planning your own leave.&lt;/p&gt;
&lt;h2 id=&quot;sections-to-include&quot;&gt;Sections to include&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#sections-to-include&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h4 id=&quot;-tldr&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;hourglass with flowing sand&quot;&gt;⏳&lt;/span&gt; TL;DR&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-tldr&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;“Too long, didn’t read”. This is for the folks who have a question or request, but don’t have time to read the whole document. Put it up front and make it visually distinct. The TL;DR can be as simple as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your question or request isn’t answered below, open an issue in &lt;code&gt;X&lt;/code&gt; or post in &lt;code&gt;Y&lt;/code&gt; and someone will point you in the right direction. Wondering the status of an in-flight project? Check out &lt;code&gt;Z&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;-dates&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;calendar&quot;&gt;📅&lt;/span&gt; Dates&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-dates&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When is your last day in the office? When do you anticipate being back? If the exact date of your leave is unknown, you can provide an estimated range, or describe the leave in relative terms (for example, &lt;code&gt;event + 2 weeks&lt;/code&gt;). Keep this section up to date as your plans change. Here’s an example of what that might look like:&lt;/p&gt;























&lt;table class=&quot;w-full border-collapse&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Start&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;End&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Dates&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;First Leave&lt;/td&gt;&lt;td&gt;Event&lt;/td&gt;&lt;td&gt;Event + 2 weeks&lt;/td&gt;&lt;td&gt;1/1/2020 − 1/15/2020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Second Leave&lt;/td&gt;&lt;td&gt;Event + 4 weeks&lt;/td&gt;&lt;td&gt;Event + 6 weeks&lt;/td&gt;&lt;td&gt;2/1/2020 − 2/15/2020&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;️-contact-preferences&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;telephone&quot;&gt;☎️&lt;/span&gt; Contact preferences&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#️-contact-preferences&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;How do you want to be contacted while on leave, if at all? What do you want to be contacted about? What’s considered urgent? Set expectations as to how often you will be checking email, Slack, your phone, and so on if you are going to check them at all, so that colleagues know how to get in touch with you, and when to expect a response.&lt;/p&gt;
&lt;h4 id=&quot;️-points-of-contact&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;writing hand&quot;&gt;✍️&lt;/span&gt; Points of contact&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#️-points-of-contact&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Enumerate all your ongoing responsibilities, along with a point of contact that will be responsible while you are on leave. Be sure to include “points of escalation” for anything not accounted for within your doc, and be sure to check with each named individual to ensure they are comfortable with the responsibility and have the bandwidth to take it on. Consider a dedicated “responsibilities to handoff” section for any key milestones, deadlines, or events expected to occur while you are out. Example:&lt;/p&gt;

















&lt;table class=&quot;w-full border-collapse&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;What&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Who&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Widget production&lt;/td&gt;&lt;td&gt;Walter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;People management&lt;/td&gt;&lt;td&gt;Paula&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;-regular-meetings&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;video camera&quot;&gt;📹&lt;/span&gt; Regular meetings&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-regular-meetings&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;List any recurring meetings you normally run or attend, their frequency, and who if anyone will be taking your place at those meetings. Be explicit with any host or presenter responsibilities, and include links to standing agendas or other supporting documents.&lt;/p&gt;























&lt;table class=&quot;w-full border-collapse&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Meeting&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Frequency&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Responsibilities&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Who&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Staff meeting&lt;/td&gt;&lt;td&gt;Mondays @ 10 AM&lt;/td&gt;&lt;td&gt;Set agenda, run&lt;/td&gt;&lt;td&gt;Susie&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;div&gt;&lt;/div&gt; with directs&lt;/td&gt;&lt;td&gt;Weekly&lt;/td&gt;&lt;td&gt;Take notes, follow up&lt;/td&gt;&lt;td&gt;Danny&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;-rolodex&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;busts in silhouette&quot;&gt;👥&lt;/span&gt; Rolodex&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-rolodex&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;For everything you touch regularly, list your primary point of contact. This will allow others to unblock themselves if they have a question or request of another department or team. Example:&lt;/p&gt;

























&lt;table class=&quot;w-full border-collapse&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;What&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Who&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;HR&lt;/td&gt;&lt;td&gt;Henry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT&lt;/td&gt;&lt;td&gt;Iris&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Legal&lt;/td&gt;&lt;td&gt;Larry&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finance&lt;/td&gt;&lt;td&gt;Fran&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;-stuff-you-touched-recently-or-hope-can-be-picked-up-while-youre-out&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;backhand index pointing right&quot;&gt;👉&lt;/span&gt; Stuff you touched recently or hope can be picked up while you’re out&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-stuff-you-touched-recently-or-hope-can-be-picked-up-while-youre-out&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;List any projects, initiatives, or other work you’ve been involved in recently, and any that you hope to be able to hand off to others while you are out. I linked out to our team project board, which captured the in-flight work, and created a “@benbalter’s GitHub Fan Fiction” document, with the backlog of ships that I had hoped would be GitHub cinematic universe cannon before going on leave. My fan fiction looked something like this, framed in terms of &lt;a href=&quot;/2018/07/16/problems-not-solutions/&quot;&gt;problems and solutions&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: I’m going on leave and want to ensure that the work I’ve been involved with recently is not lost or forgotten while I’m out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ben’s solution&lt;/strong&gt;: Write a great leave doc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ideal DRI&lt;/strong&gt;: &lt;a href=&quot;https://github.com/benbalter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;@benbalter&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;-important-links&quot;&gt;&lt;span role=&quot;img&quot; aria-label=&quot;file folder&quot;&gt;📁&lt;/span&gt; Important links&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#-important-links&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This is your long-tail appendix of anything you think your colleague might need while you’re out. This could include links to team documentation, commonly referenced spreadsheets or reports, planning materials, or anything else you think might be useful.&lt;/p&gt;
&lt;h2 id=&quot;share-early-and-often&quot;&gt;Share early and often&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#share-early-and-often&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You could have the best leave or transition document in the world, but if nobody knows about it, it’s not much use. Socialize the document with key stakeholders well before your leave to ensure accuracy and completeness&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, and make your document readily discoverable while you are out by linking to it from your chat status,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; the out of office on your calendar, and any other “APIs” you have for communicating with colleagues.&lt;/p&gt;
&lt;h2 id=&quot;putting-it-all-together&quot;&gt;Putting it all together&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#putting-it-all-together&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’re preparing to go on leave (or transition to a new role), feel free to use the template below as a starting point.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; Of course, if you have any suggestions or proposed improvements, pull requests are always welcome.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;# @your leave document&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;hourglass with flowing sand&quot;&gt;⏳&lt;/span&gt; TL;DR:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;calendar&quot;&gt;📅&lt;/span&gt; Dates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;telephone&quot;&gt;☎️&lt;/span&gt; Contact preferences&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;writing hand&quot;&gt;✍️&lt;/span&gt; Points of contact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;video camera&quot;&gt;📹&lt;/span&gt; Regular meetings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;busts in silhouette&quot;&gt;👥&lt;/span&gt; Rolodex&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;backhand index pointing right&quot;&gt;👉&lt;/span&gt; Stuff you touched recently or hope can be picked up while you&apos;re out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;## &lt;span role=&quot;img&quot; aria-label=&quot;file folder&quot;&gt;📁&lt;/span&gt; Important links&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I often ask, “Are there any questions not answered here that you can imagine might arise while I am out?” &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Using an internal or external link shortener (for example, &lt;code&gt;bit.ly/benbalter-leave&lt;/code&gt;) to create a more memorable URL for your colleagues to regularly reference your doc. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;If you’re looking for even more extended leave resources, &lt;a href=&quot;https://github.com/isethi&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;@isethi&lt;/strong&gt;&lt;/a&gt; has a great talk on &lt;a href=&quot;https://leaddev.com/san-francisco/video/navigating-parental-leave-as-a-senior-engineering-leader&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;navigating parental leave as a senior engineering leader&lt;/a&gt;. If you’re preparing to go on parental leave, be sure to check out her &lt;a href=&quot;https://docs.google.com/document/d/1VjY8xvZtHV_4p_xXUz7rRIIC4VT8B_2NasL950pQk4U/edit#heading=h.oso3zy2cszfb&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;parental leave checklist template&lt;/a&gt; as well. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Manage like an engineer</title><link>https://ben.balter.com/2023/01/10/manage-like-an-engineer/</link><guid isPermaLink="true">https://ben.balter.com/2023/01/10/manage-like-an-engineer/</guid><description>If issues, pull requests, and project boards are the best way to develop software, should they not also be the best way to manage software development?</description><pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Many engineering and product leaders begin their careers as engineers. On a typical engineering team, work is captured in issues, organized in project backlogs, and reviewed in pull requests. For most teams, this is the best way to plan and track software development work.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-7&quot; id=&quot;user-content-fnref-7&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; But as engineers advance in their careers and begin down the management path, they too often adopt an entirely different set of tools, workflows, and philosophies for managing their own work. Such management workflows are more cumbersome, more time-consuming, and more opaque than their engineering counterparts. If we believe issues, pull requests, and project boards are the best way to develop software, should they not also be the best way to manage software development?&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Rather than tracking bugs or feature requests, in my day-to-day as a Chief of Staff, I use GitHub to track all the “meta work” that supports software development and software development teams. Need to prepare a deck for a business review? Open an issue. Want to refresh our career ladders? Open an issue. Planning an offsite? You guessed it, open an issue.&lt;/p&gt;
&lt;h2 id=&quot;why-you-should-manage-like-an-engineer&quot;&gt;Why you should manage like an engineer&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#why-you-should-manage-like-an-engineer&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using engineering tools like GitHub to track management tasks is &lt;em&gt;much&lt;/em&gt; more than an alternative to your personal todo list or an endless stack of Google Docs or group DMs shared with peers. Working like an engineer forces you to work more &lt;em&gt;transparently&lt;/em&gt; than you would traditionally as a manager. I’ve written at length before about &lt;a href=&quot;/2022/02/16/leaders-show-their-work/#the-value-of-showing-your-work&quot;&gt;the value of leaders “showing their work”&lt;/a&gt;. When you work in systems that naturally capture and expose process, there are a lot of organic benefits that you and your team get for “free”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Captures institutional knowledge&lt;/strong&gt; - When you’re purposeful about where and how you share context, you alleviate the need for “you had to be there” and “go ask Susan”-type inquiries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empowers others to learn through observation&lt;/strong&gt; - What’s routine to you is likely novel to someone in another role or at another level of seniority.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Socializes organizational culture and values&lt;/strong&gt; - An organization’s culture and values are composed in large part of &lt;a href=&quot;/2015/08/12/the-zen-of-github/&quot;&gt;the underlying assumptions&lt;/a&gt; that its members fall back on as they resolve ambiguity in pursuit of the organization’s mission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuels engagement&lt;/strong&gt; - Transparency offers a sense of agency, situational awareness, and overall engagement that fosters a culture of thoughtful dialog and encourages organization-wide collaborative improvement over time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keeps the bar high&lt;/strong&gt; - Showing one’s work establishes expectations around justification, thoroughness, and accountability that sets and maintains a high standard for decision making within an organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;what-it-means-to-manage-like-an-engineer&quot;&gt;What it means to manage like an engineer&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-it-means-to-manage-like-an-engineer&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This level of open-source-like managerial transparency is far from automatic or the default for most management workstreams today. The software tools we use as managers may help influence some outcomes,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-6&quot; id=&quot;user-content-fnref-6&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; but ultimately, leaders must be deliberate in &lt;em&gt;how&lt;/em&gt; they work for their team to reap the benefits of transparent and collaborative decision making.&lt;/p&gt;
&lt;p&gt;Here are a few of the engineer-inspired “how we work” principles which I strive to embody through my own management:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make work visible&lt;/strong&gt; - Proactively share to the widest extent practical given the subject.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; Like any production system, observability is key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write things down&lt;/strong&gt; - Especially the why and how. &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;Ensure that everything has a URL&lt;/a&gt;. Be generous with links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/2017/05/23/seven-ways-to-consistently-ship-great-features/#1-over-communicate&quot;&gt;Over communicate&lt;/a&gt;&lt;/strong&gt; - Use a durable, searchable, and discoverable medium. Let others opt-in to context and subscribe to updates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bias for shipping&lt;/strong&gt; - &lt;a href=&quot;/2016/09/13/seven-habits-of-highly-effective-githubbers/#2-ship-early-ship-often&quot;&gt;Ship early, ship often&lt;/a&gt;. Whether decisions, process, or “manager code”, ship an MVP and iterate. Minimize batch size.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamline and automate&lt;/strong&gt; - Never force a human to do what a robot can. Prefer non-blocking over blocking operations. Codify policy as code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embrace collaboration&lt;/strong&gt; - How we work is as important as what we work on. Software development is a team sport.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-5&quot; id=&quot;user-content-fnref-5&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous first&lt;/strong&gt; - Reserve higher-fidelity mediums for conversations that require them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practicality beats purity&lt;/strong&gt; - These are guidelines, not rules. Process should drive outcomes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-manage-like-an-engineer&quot;&gt;How to manage like an engineer&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-to-manage-like-an-engineer&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Managing like an engineer means a manager’s go-to tools for planning, tracking, and communicating managerial work are issues, project boards, Markdown files, and pull requests:&lt;sup&gt;&lt;a href=&quot;#user-content-fn-8&quot; id=&quot;user-content-fnref-8&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt; - Issues are the atomic unit of work across teams and are the primary means by which work is planned, tracked, coordinated, and communicated, and where updates are shared.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project boards&lt;/strong&gt; - Project boards are the primary means by which work (in the form of issues) is organized, managed, prioritized, and made visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown files&lt;/strong&gt; - Markdown files are the primary means by which long-lived information is memorialized. Markdown files are created and modified via pull requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull requests&lt;/strong&gt; - Pull requests are the primary means by which proposals are reviewed and decisions are made.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;planning-and-tracking&quot;&gt;Planning and tracking&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#planning-and-tracking&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Issues and project boards create a networked hierarchy of tracking issues that bring visibility to work. This is true both of department-wide goals and initiatives, as well as all the management “meta work” that supports them.&lt;/p&gt;
&lt;p&gt;I’ve written at length before about &lt;a href=&quot;https://github.blog/2022-07-01-how-the-github-security-team-uses-projects-and-github-actions-for-planning-tracking-and-more/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;how we use issues and projects at GitHub for planning and tracking&lt;/a&gt;. We use issues and a project board to track our department-wide OKRs (quarterly goals). Teams may choose to organize issues with labels, milestones, assignees, and project boards to aid in planning and tracking. Issues can capture work at various levels of abstraction, with different “types” of issues encompassing different units of work (initiatives, epics, etc.).&lt;/p&gt;
&lt;p&gt;All of the department’s management tasks are also tracked in issues, which are made visible to everyone in the company as a management backlog via a GitHub Project. Interested stakeholders wishing to learn more about a given initiative or administrative epic can click into the linked issue to learn more or subscribe to automatically receive ongoing updates.&lt;/p&gt;
&lt;h3 id=&quot;management-decision-records&quot;&gt;Management decision records&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#management-decision-records&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Successful distributed teams place an emphasis on written and asynchronous communication. Writing things down serves as a message in a bottle to your future selves, recording what decisions were made, by whom, and why. If issues and project boards track and organize work, “management decision records”,&lt;sup&gt;&lt;a href=&quot;#user-content-fn-10&quot; id=&quot;user-content-fnref-10&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;8&lt;/a&gt;&lt;/sup&gt; socialized and discussed via pull requests, are how decisions are made and communicated.&lt;/p&gt;
&lt;p&gt;One common way engineering teams capture important decisions is through &lt;a href=&quot;https://github.com/joelparkerhenderson/architecture-decision-record&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;an architecture decision record (ADR)&lt;/a&gt;. ADRs capture not just the decision, but also its context and consequences, and do so in a way that allows stakeholders to deeply participate in the process. In short, the person responsible for a decision writes out their proposal in long-form prose, and submits it for discussion and refinement by stakeholders before it is ultimately merged to memorialize the decision.&lt;/p&gt;
&lt;p&gt;While ADRs are intended for engineering decisions, the format and rigor of documentation and process can be adapted to any type of impactful or long-lived decision, especially management decisions with broad impact. That’s not to say that management decision records democratize or crowdsource management. Rather, it formalizes and makes transparent the socializing process that already happens when making such management decisions.&lt;/p&gt;
&lt;h3 id=&quot;automate-all-the-things&quot;&gt;Automate all the things&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#automate-all-the-things&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Better still, since GitHub is an extensible platform, automation of day-to-day issue management can be “cheap” to implement via shared GitHub Actions. If a given OKR hasn’t received an update in a while, we use Actions to nudge the responsible individual. When status updates come in as issue comments on a regular cadence, Actions updates the project board so that the health of all our OKRs can be seen in a single view. We even use Actions to automate issue creation at the kickoff of the planning cycle, or to have regular meeting and 1&lt;/p&gt;&lt;div&gt;&lt;/div&gt; agendas created each week.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-9&quot; id=&quot;user-content-fnref-9&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A decade ago, I argued that &lt;a href=&quot;/2012/12/16/deprecate-management/&quot;&gt;working like an open source project would allow us to “Deprecate Management”&lt;/a&gt;. As I wrote then:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are so many aspects to the work day that we do just because it’s the way things have been done since the dawn of the industrial revolution, and it puzzles me why nobody’s stopped to think critically about how these processes could be reimagined in an age of technology.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today, I don’t believe that a complete “deprecation” of management is possible, at least not at scale, but by working in the open, managers can shed a lot of management meta-work, moving managers from lower-level to higher-level, more impactful work.&lt;/p&gt;
&lt;p&gt;Managing like an engineer means using the same tools and workflows that engineers use to plan, track, and communicate their own work. It means making work visible, writing things down, and embracing collaboration. After all, if that’s the best way to build software, should it not also be the best way to manage software development?&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-7&quot;&gt;
&lt;p&gt;Yes, there are different flavors and tools (agile, scrum, Jira tickets, etc.), but at a high level, most teams have some sort of ongoing list of outstanding todos, along with a standard mechanism to review proposed changes. &lt;a href=&quot;#user-content-fnref-7&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;Long before the term “inner-source” became popular, GitHub had co-opted the workflows and communication patterns of the open source community for its own internal development. While much has been written over the years about “how GitHub uses GitHub to build GitHub”, the concept of using GitHub to &lt;em&gt;manage&lt;/em&gt; GitHub fell out of popularity as GitHub grew (and outgrew its own tools). Now that GitHub has native planning-and-tracking capabilities, it’s the perfect tool for managers. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-6&quot;&gt;
&lt;p&gt;For example, transparent and inclusive decision making comes more naturally in a tool built for collaboration like GitHub than it does in a tool built for conveying information like Slack or email. That’s not to say it can’t be done, but the tool’s vision of how work should occur and yours may differ, making things more difficult on both you and your team. When in doubt, start from first principles and ask yourself, “what is the best tool for the job?” &lt;a href=&quot;#user-content-fnref-6&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;HR and other personnel matters must often be restricted in their visibility due to their sensitivity, but the vast majority of management work can be shared with increasing circles of trust (peers, other managers, the team, the org, the company, etc.). I’ve even seen one team use &lt;a href=&quot;https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Mermaid diagrams in Markdown files&lt;/a&gt; to visualize their org chart. Re-org by PR? &lt;span role=&quot;img&quot; aria-label=&quot;thinking face&quot;&gt;🤔&lt;/span&gt; &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-5&quot;&gt;
&lt;p&gt;Encourage collaboration among team members, both in terms of setting team-wide goals and executing on individual initiatives. This helps everyone “connect the dots” and understand how their work fits into the bigger picture (and to shape it along the way). &lt;a href=&quot;#user-content-fnref-5&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 5&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-8&quot;&gt;
&lt;p&gt;I write about my experience using GitHub, but there’s no reason these philosophies couldn’t be implemented using another engineering tool. The key is to use a tool that is built for collaboration and transparency and that is extensible via automation. &lt;a href=&quot;#user-content-fnref-8&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 6&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Track tasks and their progress in issues, cc relevant teams, and cross reference relevant issues to naturally &lt;a href=&quot;/2015/11/18/tools-to-empower-open-collaboration/#2-captures-and-exposes-process&quot;&gt;capture and expose process&lt;/a&gt;. Issues bring the most value to teams when work happens on and around the issue, rather than holding important discussions in chat or over video with the issue being used merely as a &lt;code&gt;TODO&lt;/code&gt; with tracking open and closed state or a broadcast medium for occasional formal updates to stakeholders (for which Discussions are better suited). &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 7&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-10&quot;&gt;
&lt;p&gt;Depending on the context, these may also be referred to as “business decision records” (BDRs). &lt;a href=&quot;#user-content-fnref-10&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 8&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-9&quot;&gt;
&lt;p&gt;Taking the metaphor further, there’s no reason why a manager’s workflow couldn’t have its own “CI”, in the sense that automated checks could keep a high bar for, for example, decision making by ensuring necessary stakeholders were consulted, that ample opportunity was offered to provide feedback, and so on. We use this lightly in some places to encourage inclusive language or readability of documentation. &lt;a href=&quot;#user-content-fnref-9&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 9&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item><item><title>Helpful 404s for Jekyll (and GitHub Pages)</title><link>https://ben.balter.com/2022/06/30/helpful-404s-for-jekyll-and-github-pages/</link><guid isPermaLink="true">https://ben.balter.com/2022/06/30/helpful-404s-for-jekyll-and-github-pages/</guid><description>How to build 404 pages for Jekyll and GitHub Pages that automatically suggest similar URLs to those requested, using Levenshtein distance and your sitemap.</description><pubDate>Thu, 30 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;While the internet has long had a soft spot for &lt;a href=&quot;https://www.pagecloud.com/blog/best-404-pages&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;clever &lt;code&gt;404&lt;/code&gt; pages&lt;/a&gt;, it’s rare to see one that’s actually &lt;em&gt;helpful&lt;/em&gt;, especially for static sites like Jekyll or GitHub Pages that make dynamic searches more difficult. Great 404 pages should help visitors find what they’re looking.&lt;/p&gt;
&lt;p&gt;Here’s how I updated the &lt;code&gt;404&lt;/code&gt; (not found) pages on my own site to resolve typos and suggest other pages potentially relevant to the visitor’s intended URL, in case you’d like to implement the same or similar functionality on your own site:&lt;/p&gt;
&lt;h2 id=&quot;how-my-404-page-suggests-alternate-urls&quot;&gt;How my 404 page suggests alternate URLs&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-my-404-page-suggests-alternate-urls&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you were to click an invalid link or typo a URL on my site, the following would occur:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You’d see a &lt;code&gt;404 - not found&lt;/code&gt; page&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Your browser would retrieve and parse my site’s &lt;a href=&quot;/sitemap-index.xml&quot;&gt;&lt;code&gt;sitemap.xml&lt;/code&gt;&lt;/a&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Your browser would find the valid path that has the shortest &lt;a href=&quot;https://en.wikipedia.org/wiki/Levenshtein_distance&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;edit distance&lt;/a&gt; from the path you requested&lt;/li&gt;
&lt;li&gt;Your browser would update the &lt;code&gt;404&lt;/code&gt; page with a link to the suggested path&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-it-looks-like&quot;&gt;What it looks like&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#what-it-looks-like&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;!-- lychee-ignore --&gt;
&lt;p&gt;Let’s say you tried to navigate to a path that doesn’t exist like &lt;a href=&quot;/2022/06/30/unhelpful-404s-for-jekyll/&quot;&gt;&lt;code&gt;/2022/06/30/unhelpful-404s-for-jekyll&lt;/code&gt;&lt;/a&gt;. Along with a list of recent posts, the experience, would look something like this:&lt;/p&gt;
&lt;p&gt;The page you are trying to view does not exist.
&lt;strong&gt;Perhaps you’re looking for &lt;a href=&quot;/2022/06/30/helpful-404s-for-jekyll-and-github-pages/&quot;&gt;/2022/06/30/helpful-404s-for-jekyll-and-github-pages/&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#how-it-works&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This functionality is driven by a surprisingly small amount of JavaScript (&lt;a href=&quot;https://github.com/benbalter/retlab/blob/main/js/script.ts&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;really TypeScript&lt;/a&gt;):&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { closest } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;fastest-levenshtein&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; div&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; document.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;four-oh-four-suggestion&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (div) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; xhr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt; XMLHttpRequest&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  xhr.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;onload&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (xhr.status &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 200&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; xml&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; xhr.responseXML;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; urls&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Array.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(xml.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;urlset &gt; url &gt; loc&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFAB70&quot;&gt;el&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; el.textContent);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;closest&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(window.location.href, urls));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      div.innerHTML &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt; `&amp;#x3C;a href=&quot;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;pathname&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}&amp;#x3C;/a&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      div.innerHTML &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;&amp;#x3C;a href=&quot;/&quot;&gt;/&amp;#x3C;/a&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  xhr.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;GET&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;window&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}//${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;window&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}/sitemap.xml`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  xhr.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#B392F0&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-v01&quot;&gt;The v0.1&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#the-v01&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Could it be written better? Absolutely (but it works!). For now, I’m using &lt;a href=&quot;https://github.com/ka-weihe/fastest-levenshtein&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;fastest-levenshtein&lt;/code&gt;&lt;/a&gt; to find the closest path to the one requested, and the lower level &lt;code&gt;XMLHttpRequest&lt;/code&gt; and &lt;code&gt;querySelectorAll&lt;/code&gt; to retrieve and parse the XML sitemap.&lt;/p&gt;
&lt;p&gt;Along with better error handling, this could also be implemented with the more modern &lt;code&gt;fetch&lt;/code&gt; API to retrieve the sitemap and something like &lt;a href=&quot;https://github.com/NaturalIntelligence/fast-xml-parser&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;fast-xml-parser&lt;/code&gt;&lt;/a&gt; to more properly parse the XML, but my modern JavaScript knowledge is limited.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; If you’d like to take a pass at a better implementation, &lt;a href=&quot;https://github.com/benbalter/retlab/edit/main/js/script.ts&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;pull requests are always welcome&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I click on a broken link, the site that I land on should point me in the right direction. After all typo’d or updated URLs are not uncommon, and the site I’m visiting knows more about the site’s content and structure than I ever will. While it’s still true that &lt;a href=&quot;/2015/11/12/why-urls/&quot;&gt;everything should have a URL&lt;/a&gt;, sometimes those URLs change or get lost in translation. Although you might hope a visitor would never see one, great 404 pages go that extra step and help visitors find what they’re looking for. If you’re interested in implementing the same functionality on your own site, the code above is part of the &lt;a href=&quot;https://github.com/benbalter/retlab&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;retlab&lt;/code&gt; Jekyll theme&lt;/a&gt;, and is licensed under &lt;a href=&quot;https://github.com/benbalter/retlab/blob/main/LICENSE.txt&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;The MIT License&lt;/a&gt;.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot; aria-label=&quot;Footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;a class=&quot;anchor-link&quot; aria-label=&quot;Link to this section&quot; href=&quot;#footnote-label&quot;&gt;&lt;span class=&quot;anchor-icon&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;When a visitor tries to access a URL that does not exist, GitHub Pages &lt;a href=&quot;https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-custom-404-page-for-your-github-pages-site&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;will serve the &lt;code&gt;404.html&lt;/code&gt; file in the site’s root directory&lt;/a&gt;, if one exists. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Generated automatically by &lt;a href=&quot;https://github.com/jekyll/jekyll-sitemap&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the Jekyll Sitemap plugin&lt;/a&gt;. The same implementation would work with any other static site (or static site generator), so long as your site has a comprehensive &lt;code&gt;sitemap.xml&lt;/code&gt;. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;I’m proud to say that no &lt;code&gt;jQuery&lt;/code&gt; was harmed in the making of this functionality. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><author>ben@balter.com</author></item></channel></rss>