Skip to content

Instantly share code, notes, and snippets.

@xpepper
Created October 10, 2023 10:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xpepper/592282fa1a3b714e1b5ff9fc6757a222 to your computer and use it in GitHub Desktop.
Save xpepper/592282fa1a3b714e1b5ff9fc6757a222 to your computer and use it in GitHub Desktop.
The Ultimate Guide to Developer Counter-Productivity
markmap
colorFreezeLevel color maxWidth initialExpandLevel
2
#2980b9
300
1

Productive vs counter-productive developers

😃 productive developers spend more of their time and energy on high-leverage activities

😡 counter-productive developers spend more time and energy on low or negative-leverage activities

  • this is often only marginally within their control
    • sometimes completely out of their control

where is this time/energy going?

we should focus on addressing the known sources of low/negative leverage

  • instead of measuring individual developer productivity...

Action items 🎯

for the team

  • for the next two weeks track when your time falls into these buckets

for managers

  • where can you shift time spent in these areas to higher leverage areas?

Reactive, Unplanned Work

time spent on reactive, unplanned work that only fixes the most immediate issue

  • e.g. dealing with
    • urgent bugs to fix
    • unplanned system outages
    • incidents in productions
  • anything that could have been prevented with better planning or monitoring
  • 😡 ”it feels like I'm just putting out fires all day. Instead of coding, I'm playing whack-a-mole with system issues”
    • sprints with a lot of bugs due to having a new system in production and the people working on the latest major changes that left the company

Context Switching and Startup Costs

time spent context-switching and incurring "startup costs" to move between tasks, get set up, and collect the necessary things to do the work

  • e.g.
    • 😫 ”just when I get into the zone, I have to switch tasks. It takes me another half-hour just to pick up where I left off”
    • 😫 ”every time I have to context-switch, it's like starting my day all over again. So draining”
    • 😫 ”no, I don’t ‘have a second’. Because a second turns into half an hour”
  • sometimes we ourselves auto-generate those interruptions
    • internal interruptions
    • pomodoro technique as a tool to help you stay focused 🍅
    • context-switching between focused time on actually delivering changes and meetings

time spent getting situated in new parts of the codebase

time spent orientating yourself to tasks you were working on but paused

time spent "getting your head in the game" after a long, draining meeting

Non-value-adding Administrative & Compliance Work

time spent on administrative work that has no direct value to customers or the team

time spent getting approvals to use certain tools

  • or making do with less effective tools during that time
  • or when you give up altogether
  • e.g.
    • 😭 ”I spent three hours today just filling out forms to get access to a tool that should be standard for my job”

time spent on performative compliance efforts that don't effectively reduce risk to customers or the business

time spent navigating global mandated processes without the freedom to adapt them to local concerns

Ineffective Planning

time spent estimating, speccing, discussing, and pitching ideas and work before the “last responsible moment”

  • writing specifications and proposals and not getting valuable or collaborative improvements to the ideas
  • e.g.
    • 😡 ”we had a two-hour meeting about a feature that won't be built for another six months. What a waste of time”
    • 😮‍💨 ”we spent weeks planning, and now the requirements have changed. All that effort feels wasted”
    • 🥵 ”we didn't plan at all and just started coding. Now we're paying the price”
    • just-in-case backlog refinements when we have the top of our backlog full of items for the next two sprints (at least!)

time spent unnaturally or ineffectively splitting work into units for sprint planning, burn-downs, sprint metrics, etc.

  • adding unhelpful abstractions of the work on top of the actual work

Dependency Management Overhead

time spent waiting for deliverables from other teams that are behind schedule, causing delays in your work

  • in theory, you can do other work, but often, it is not high leverage
  • e.g.
    • 🙄 ”I feel like half my job is chasing other teams for updates. Why can't we just have a clear plan and stick to it?”
    • 😫 ”We're always waiting on another team. It's like our project's success is out of our hands”
    • a big tech migration of a core sw component that is used by several other components downstream, whose teams have to made changes before we could release our change

time spent in meetings and discussions to align with other teams when a more streamlined communication process (or less structured, more embedded) could have been effective

time spent coordinating and managing dependencies that could be safely removed

  • this is also true in code, where we could depend on lib that are used by dead code that we don’t remove because we “don’t have time” or “we don’t know if it’s actually used by some other system”

note: these are more systemic issues, that has no easy solutions and requires combined efforts, the right alignment and authority, a good overall system view and a lot of energy

Ineffective Meetings and Communication

time spent engaging in

  • ineffective communication
  • ineffective meetings
  • synchronous meetings that should be asynchronous
    • 😫 “we just had an hour-long meeting that could have been an email. My whole day is thrown off now”
  • asynchronous meetings that should be synchronous
    • 😡 ”we tried to handle this complex issue through email threads and ended up misunderstanding each other. Should have had a quick call”

time spent scanning communications for relevance and 'catching up' on communications

time spent in meetings and other activities where the things that need to be said aren't said

  • due to
    • low psychological safety
    • judgment
    • fear of retribution
      • 😔 ”we keep having these meetings, but no one speaks up because they're afraid of backlash. It's pointless”
    • low confidence that things can actually change
  • needing to repeat those activities repeatedly

time spent repeating the same information to different audiences in the same way

  • we expect to re-contextualize information for different audiences, but if it is the SAME information, that is counterproductive

Consensus Seeking and Decision-making Drag

time spent seeking consensus across a large group of people when decisions could be made more locally

  • 😓 “I feel like we're in a decision-making loop. We discuss, decide, and then second-guess ourselves”

time spent dealing with hasty local decisions that could have been better made with a couple more people involved

  • making key decisions without appropriate support and information
  • time lost dealing with local optima solutions that are suboptimal as at bigger scale
  • 😳 “so we're having another meeting to decide what we already decided last week? Great”

time spent adapting to rapid and reactive top-down changes in direction

  • 😥 “a decision was made without involving anyone who actually works on the project. Now we have to redo it”

Ineffective Collaboration Arrangements

time spent working alone when working together would be more effective, and vice versa

  • 😒 “if we paired, this would be done in an hour”
  • 😩 “I can’t get a second to work alone on this”

time spent using transactional processes and work approaches for things that should be collaborative

time spent using collaborative and high-touch methods for situations that can be safely transactional

Lack of Help and Support

time spent thrashing due to lack of help, difficulty getting help, people being too busy to help

  • ...or a culture that frowns upon asking for help
  • 🙁 “I could solve this in five minutes with a little help, but everyone is 'too busy' to answer a simple question”

time spent locating the right individual or department to assist with a specific issue leads to a runaround

  • 😒 “I finally found the right person to help me, but it took three days of getting the runaround”

Ineffective Documentation

time spent writing documentation that no one reads

time spent skimping on documentation that could save people time and improve their work experience

time spent interpreting specifications or context once or twice removed from the source

  • 😑 “I spent two hours today deciphering outdated documentation. I still don't have my answer”

Poorly Maintained Code and Docs

time spent navigating or working with difficult-to-understand or poorly maintained code, documentation, etc.

  • ...without fixing issues as you encounter them
  • 🤮 “the code is such a mess that it feels like archeology, not programming”

Workarounds

time spent doing workarounds that themselves are slower

  • but also create additional confusion down the road for other team members
  • 😑 “we have so many hacks in the code now, it's like walking through a minefield. One wrong step and everything blows up”

time spent documenting and explaining workarounds to other team members

  • 😒 “I spent half my day documenting a workaround that's just going to confuse the next person who sees it”

time spent revisiting and maintaining workarounds

  • doing manual work because a third-party service we’re using to publish our listings is not working as we expect

Inefficient Onboarding

time spent correcting mistakes or misunderstandings that arise from an incomplete or rushed onboarding process

  • 😒 “new hires spend their first week just figuring out our convoluted setup process”

time spent getting new team members up to speed on things (that could be effectively streamlined) without having enough time to share broader context and build relationships

time spent repeatedly covering basic project details for new hires because of a lack of standardized onboarding materials or procedures

  • 😟 “it feels like every new team member is reinventing the wheel because our onboarding is so disorganized”

Tooling Challenges

time spent getting finicky tools to work, using outdated tools, or getting tools to play nice together

  • this includes manually reinstalling tools and repeatedly setting up your environment manually
    • 🙄 “if I had a nickel for every time I had to manually reset my dev environment... I'd have a lot of nickels!”

time spent using the wrong tool for a job, working more slowly, and producing more errors or workarounds

  • 😟 “we automated the task, but the tool we used is so complicated that now no one knows how to fix it if something goes wrong”

time spent trying to diagnose issues ineffectively

  • something is not working, and you are trying to figure out why
    • and you don't have the tools/observability to be effective
    • in some cases, you leave issues open
    • in other cases, it takes much longer to get to the bottom of things

time spent resolving conflicting versions of libraries or packages when they could be standardized across projects

Manual, Automation-friendly Tasks

time spent on manual, high-volume, repeatable tasks that are good candidates for automation

  • this also includes fixing errors caused by doing these tasks manually
  • 😫 “why am I still doing this manually? We have the technology to automate this! It feels like we’re stuck in 2004”

time spent manually updating dependencies when automation tools could have been used to keep them up to date

Waiting on Slow Processes

time spent waiting on a slow-running process without the ability to context switch

  • you can't do something else, but you're waiting
  • 🙁 “I tried to multitask while waiting, but the context-switching just made it worse”

time spent waiting for compute-intensive tasks to complete, like builds or data transformations, which could have been optimized

  • 😔 “I could have finished this hours ago, but I'm still waiting on the build to complete”

Rework, Validation, Feedback, and Premature Convergence

time spent working on something without validating earlier assumptions as it degrades the leverage of what you are doing right now

  • 😤 “I wish we had just validated this before building it out. Now we have to backtrack”

time spent locking down something prematurely, often to 'show something' to managers, when it would have been better to start more minimally and evolve it over time

  • 😕 “we should have just shipped this and started monitoring feedback”

time spent delayed due to a lack of immediate feedback

  • yes, you can do something else while waiting
    • ...but you incur context-switching costs
    • and the valuable task requiring feedback is on hold
  • 😫 “I guess I’ll just keep going based on the assumption that this is true. But the evidence is super shaky”

time spent working with incomplete context or information where your work might be better informed and more effective

  • ...or your time might have been better spent focusing on learning
  • 🤬 “a product manager made up this user story, I can tell. I’m not sure they really understood the data or feedback”

time spent chasing perfect information or complete certainty when roughly right decisions will suffice

    • waiting for the “perfectly defined” user story on Jira before starting to work on it

time spent trying to decode how people translate customer needs when it would be better to connect directly

  • time spent working off of hastily pulled together research or things not researched with the right methods

Unreleased Code

time spent on code that sits around without being released to customers, not eliciting feedback or producing value

  • 😑 “My code is just gathering dust because it hasn't been released yet”
  • 😒 “Who knows if this will even pass the checks anymore”
  • 😨 “We’re on the fifth phase of this projects, and haven’t actually delivered anything. Funny, right? The burndown looks good though”

time spent not integrating code and seeing how it plays with the broader codebase

Building Low-Value Features

time spent building things that customers don't use, are over-built or over-engineered, or focus only on short-term revenue

  • thereby passing the costs to future developers
  • 😕 “I built this feature that nobody uses. It's like building a bridge to nowhere”
  • 🙄 “Sure we closed the customer, but that is some weak-assed revenue”

time spent doing made-up projects due to delays in feedback and direction and pressure to remain busy during lulls and gaps

time spent completing "promotion-drive" efforts solely designed to test individual developers

  • 😒 “Well, my performance review said I was light in this area, so we invented this project I could work on to prove myself”

Artificial Deadlines & Rushing

time spent working ineffectively to meet artificial deadlines

  • often leading to working overtime even when in degraded mode
  • 😣 “We're rushing to meet a deadline that someone pulled out of thin air—and dropping a lot of balls in the process”

time spent working hastily and making mistakes along the way, feeling rushed

  • 😔 “I’m working at like 50%. I’m not making great decisions”

time spent delivering work before it is needed or ahead of work that might be more valuable

Poor Timing/Energy Fit

time spent during poor timing / energy fit periods

  • e.g.
    • afternoon meetings for tasks that require deep thinking
    • morning meetings during the best concentration window
  • 😓 “Why are we having a brainstorming meeting at 4 PM on a Friday?”
  • 😠 “They scheduled a routine update meeting during my most productive hours. There goes my flow”

time spent trying to rest and recharge, but it is not effective due to interruptions

  • you are less effective when you try to get productive later in the day
  • ☹️ “Every time I say I am going to take a real lunch, I end up on a stupid Zoom call”

Skill Mismatch

time spent on things where there is poor skill fit

  • something that is way out of the person's skill set
    • 😰 “I hate to admit it, but I am way over my head”
  • something that is way below their skill set
    • 😪 “I’m bored, and half checked out”

Knowledge Loss

time spent re-learning information that was lost when people who didn't have an opportunity to pass along that knowledge left the company

  • 🫤 “Our key expert left, and now we're spending weeks just to re-learn what he knew”
  • 😤 ”No one on the team has actually met a customers. That’s crazy”

Redundant Manager Briefing & Orientation

time spent briefing and orienting managers because they are too busy to be directly involved

  • 😞 “my manager is so out of the loop, I have to spend hours each week just catching them up”

time spent getting people back up to speed or getting people current on progress because they were too busy to remain involved in what was happening

  • 😒 “I briefed my manager last week, and today they asked the same questions. Do they even listen?”

Missed Opportunity Costs

time NOT spent on high-leverage work, exchanging valuable context, cross-training other people, and keeping up with technology trends

  • these represent opportunity costs that the other items on the list keep you from attending to

time spent not fixing the things mention in this list

  • especially when not fixing something makes it harder to fix in the future
  • 😞 “I wish I could just spend one day making these paper cuts go away”
  • 😔 “I wish I had time to work on more impactful projects, but I'm stuck doing reactive tasks”

Second and Third-Order Effects

time spent doing less effective work due to the second and third-order effects of all the items mentioned above

  • including
    • loss of morale and confidence
    • psychic harm
    • "checking out"
    • disconnecting from work
  • 😭 “All these small inefficiencies are really starting to affect team morale. It's a downward spiral”
  • 😒 “The money is good, and I’m going to lock in my options. I can’t change this place”
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment