Unbounded ticket backlogs are one of the most pernicious influences facing an engineering team. Consider:
- A team’s capacity (the amount of work it’s capable of doing in a given week) is limited. As the ticket backlog grows, so grows the number of tasks that will never be finished.
- Keeping tickets that will never be finished amounts to a tacit denial of the team’s limited capacity. It’s pure fantasy to imagine that every ticket in the backlog is one that the team might eventually get around to.
- Keeping tickets that will never be finished hides information about the team’s capacity and agenda, making it near impossible to reason about priorities. A giant backlog offers no information about what the team considers important, and it invites stakeholders to share in the delusion that all work will eventually get done.
- A large ticket backlog is just demotivating. No one even contemplates digging into the backlog because of how Sisyphean that would feel.
- To top it all off, a large, unbounded ticket backlog perpetuates itself. The more tickets you have, the less empowered you feel to say no.
Why ticket backlogs grow
Like any queueing system, a ticket backlog will grow without bound if tasks arrive faster (on average) than they leave.
Every engineering team has more ideas than time. There are many things that your team should probably do, but you’ll never have enough time to do them all. Add to this the firehose of feature requests, bug reports, and maintenance tasks, and it’s easy to see why tickets arrive in a backlog like… well… a firehose.
But we already know where tickets come from. That’s only one of two important variables. Why don’t tickets ever leave faster than they arrive?
Because we refuse to close them, of course! When a ticket represents a neat idea our team had, we don’t want to close it because the idea is still neat. And when it represents a request from a different team, we don’t feel empowered to close it because we feel it’s our team’s job to fulfill that request.
So tickets enter our system faster than we get rid of them. This usually leads to one of two situations:
- Growth without bound. Your ticket queue has 4000 tickets in it, and it’s become a running joke on the team that “oh sure, we’ll get around to it when we finish the rest of the ticket queue.” Sound familiar?
- Automatic closing. You write a cron job to auto-close tickets that haven’t been touched in a year, on the assumption that “if it’s important, they’ll re-open it.” Instead of making informed, thoughtful decisions about what work is most important to your team, you leave the problem to the vagaries of ticket reporters and the march of entropy.
It doesn’t have to be like this. But the solution is so obvious that most people will dismiss it out of hand.
Cap your ticket backlog.
Letting your backlog grow without bound is a form of information hiding. It serves only to obfuscate. So why not just cap its size? Say “from now on, there can’t be more than 10 tickets sitting in our backlog.”
Think of all the benefits:
- You’ll force yourself to make decisions about which tasks are critical to your team’s success.
- You’ll develop a sense of how much work you can realistically commit to.
- You’ll know at a glance which types of tasks are in most dire need of streamlining.
- You’ll understand, all at once and without summarizing, what’s in the backlog.
- You’ll start looking at the backlog and thinking “I can put a dent in that.”
At first it will be hard to come to terms with the fact that most of the things in your backlog are never going to get done. But that’s a fact. The sooner you accept it, the better for everyone: not just your team, but also the people who make requests of you. It doesn’t serve anyone to pretend that you can finish every piece of work that would be nice to do.
Putting it into practice
My team at Etsy has started capping its backlog at 10 issues.
Each Tuesday morning, we meet in Slack for 15 minutes. We look at a JIRA filter that shows all unassigned tickets that haven’t been updated in the last 2 days. If there are more than 10, we prune the list.
There are a bunch of different ways we can remove a ticket from the backlog, including:
- Mark for clobbering. Apply the label clobbering-time to an issue. This adds it to the list of issues that we’ll draw from during a Clobbering Time session. Clobbering Time is a monthly event where we try to knock out as many non-urgent tasks as possible. As such, Clobbering Time issues should be resolvable by a single engineer within an hour.
- Move to another project. If it’s not a thing our team needs to do, move the ticket to the appropriate project.
- Assign to someone. If someone’s ready to work on the issue immediately, assign it to that person.
- Request more details. If the issue isn’t clearly defined enough to begin work, assign it to the creator and request more details. Make sure to un-assign the issue once enough details are received.
- Close. Just close outright, with a comment explaining that we don’t have enough bandwidth.
At first, we found a lot of low-hanging fruit. There were many clobbering-friendly tickets we could remove immediately, and there were many others that simply were no longer relevant.
As we use this process more, we’re going to start having to make tougher decisions. We’ll have to choose between tasks that seem equally essential. It won’t always be pleasant, but I believe it’s necessary and we’ll be glad we did it, because ignoring those difficult decisions is worse.