This post is meant to be such a guide. I have three goals.
The first goal is to look back: To identify experiences we both may have had in the past. These will help us establish some common ground of understanding. They’ll serve as reference points to judge other unfamiliar problems.
The second goal is to look forward: To identify new issues that you may have not experienced yet, but likely could in the future depending on your path. I hope these items will help you prepare for what’s coming and decide for yourself what’s worth pursuing.
The third goal is to help you empathize and have mutual respect for the difficulties your teammates are facing. You may never endure many of the forward looking-items, especially if you’re not a tech lead or manager. Similarly, if you are a tech lead or manager, you may have forgotten what it feels like to be an individual contributor; you may be out of touch with the day-to-day realities. I want to help everyone get on the same page.
The lists in the sections below are not in order of priority. They include observations that other people have told me about; they’re not necessarily things I’ve experienced directly. So if you and I have worked together in the past, please don’t assume that a particular example is about you. It’s amazing how common these stories are.
It’s also important to note that there are other categories of horrible things that this post does not confront at all: racism, sexism, ageism, aggression, and many other factors that contribute to a hostile work environment. I’m not qualified to write about these topics, and they’ve been described and analyzed thoughtfully elsewhere.
My objective in writing this post is to enumerate what follows from the nature of building software in teams. If you think I missed anything, please let me know. I can imagine that many of these points, especially in the lead and manager lists, also apply to other disciplines. And please keep in mind that these roles aren’t all bad; my next post on this subject will be about the good things.
What’s awful about being a software engineer?
For an individual contributor who writes code and is directed by a tech lead or manager.
- There’s just too much to learn and not enough time
- The code is poorly written
- The current abstractions are bad
- I would have done this differently
- The comments don’t make any sense, aren’t up-to-date
- No documentation about how something was built or why it works this way
- The build is slow
- The tests are slow
- The tests are flaky
- There are no tests
- Bad frameworks that require a lot of boilerplate, complex code, or confusing tests
- Managers want me to sacrifice code quality for development speed
- Dependencies change without notice
- Differences between local dev, testing, and production
- Getting ratholed on a problem or debugging for a long time
- Broken or flaky tests that I need to modify but didn’t write originally
- Bugs or production issues that I have to deal with that other people caused, but they aren’t actively trying to fix right now
- Having to maintain someone else’s crappy code or systems after they leave
- Things that aren’t automated that should be
- Getting interrupted constantly by teammates and my manager
- Context switching costs
- My manager asks me to work on emergency projects
- In code reviews my teammates are assholes and it feels like a personal attack
- Other people are late in delivering the functionality that I need to do my job
- Other engineers build their features or components too slowly
- I have to wait for other people a lot
- There are product decisions that I don’t agree with
- I feel like I’m just getting told what to do
- No autonomy
- Nobody respects my opinion
- I work my ass off and then someone tells me to redo it
- Product managers change requirements on me because they’re overly reactive to criticism or feedback from other people
What’s awful about being a tech lead?
For a software engineer who writes code and also leads the design and implementation work of a small group of individual contributors (who are managed by someone else).
- Everything in production is broken all the time
- Too many emails or documents to read and respond to
- Work slips through the cracks
- Falling behind on everything
- Other people are making technical design decisions that I don’t agree with, but I don’t have the ability or authority to convince them to change their minds
- Implementations that are sloppy or ignore existing best practices
- Things coming up that I didn’t plan for; late feature requirements that break my assumptions
- I can get really stressed out about deadlines and dependencies, which makes it hard to unwind when I’m home from work
- Everyone needs more supervision than I expect, no matter how hard I try to explain the details or document the plan
- Launching something publicly takes forever and is blocked for bullshit non-technical reasons
- Making the difficult choice between time and quality; deliberately shipping known bugs to production
- I’m being responsible, why isn’t everyone else?
- I’m falling behind on my responsibilities and nobody is helping me
- I don’t understand what my manager does all day, but I don’t think it’s useful
- I don’t understand what the product managers do all day, but I don’t think it adds value
- It feels like other engineers on my team are trying to undermine me by not following the plan we already agreed to; I feel like a tattletale when I talk to their managers about it
- Projects I thought would be my responsibility were taken away from me and given to someone else for reasons I don’t understand
- I don’t have enough engineers working on my project to get the work done in a reasonable amount of time
- People don’t listen when I say how hard something will be and they’re unwilling to reduce scope
What’s awful about being an engineering manager?
For someone who manages a group of software engineers. This person may also be the tech lead, or manage tech leads who direct their reports.
- It’s hard to ask or tell people what to do without feeling like an asshole
- It feels like everything is an emergency all the time
- It feels like everyone is always complaining to me all day long
- I have zero time for email
- I have zero time for chit chat, even though I feel like an asshole for not being more social
- When I get home I feel beaten up; sometimes it can be too much; if my significant other or people close to me are having issues they want to talk about, I can be so burnt out by the time I leave work that I’m unable to listen to their problems anymore.
- At all times, some number of my reports are in one or more of these states:
- About to quit
- Upset at someone else on my team
- Upset at someone else on another team
- Upset with me
- Offended by someone for good reason
- Offended by someone for no good reason
- Unhappy with the codebase for legitimate reasons
- Unhappy with the codebase for perfectionist / invalid reasons
- Unhappy with their project and want to work on something else, even though what they were doing is the most important thing
- Having personal issues that are affecting their well-being, often causing them to have a negative effect on the morale of those around them
- Bored; clear they’d take a new job if the right one was offered to them
- Other managers do work by scheduling meetings. They can’t write code; their only way to influence things is to talk. So I’m pulled into a bunch of useless meetings. And they almost always feel like a waste of time.
- Writing less code sucks; it feels like I’m losing my edge. Sometimes it’s hard to see how I’m contributing. I have to change my perspective on what I value. Finding satisfaction in helping others become more productive feels unnatural.
- I’m going to miss making an important technical decision and things will go terribly wrong
- A project is going to fall behind or fail because I delegated it to the wrong person
- It feels like other managers are trying to undermine me with politics
- My biggest problems are confidential and I can’t ask for support or advice from anyone
- It’s unclear what the CTO/VP of engineering does; they don’t seem to add any value; they ask ignorant questions and are generally disrespectful
- Some of my best engineers are wasting their time on projects that don’t matter, but I don’t want to stop them from doing it in fear that it’ll push them away from the team and lead them to quit
- Everyone disagrees with at least some part of how I’m managing the team