Why backlogs are useless, why they never shrink, and what to do instead
lucasfcosta.com
lucasfcosta.com
> That’s what backlogs are: a bunch of unimportant tasks that we’ll eventually get to, but not today.
Not in my experience. At least I disagree with "unimportant."
> The truth is, we always know what task is most important, and we work on it until it’s done.
Again, not in my experience. There's been plenty of times I've reached into the backlog rather than go idle.
Fundamentally, in my experience there are lots of little feature improvements and bugs you come across that are worth documenting. I believe the issue tracker is the right place. If you don't document these things they'll soon be forgetten -- what a waste!
It's surprising how often you find cases where we couldn't do A, because it depended on B which we didn't have back then and it would have been too much work to do B just to get A, so A just gets backlogged. But now that B is finally getting funded, if we do B right, we can let A come along for the ride almost for free. Then a whole bunch of related things like that can get cleared from the backlog all in one fell swoop.
The other time it's good to dip into the backlog is when the problem has become more serious due to shifts in usage patterns meaning the impact now justifies the work when it may have been borderline before.
That could be UX improvement, ideas to speed up the CI pipeline, or general code improvements which take more than an hour max.
Each sprint one person (we cycle though) can use 20% of his time to do these tasks (we call them greenkeeping).
Works very well so far.
But backlogs? They are useful, they have the most important tasks, important also to remember corner case issues and prioritize tasks, given the right circumstances they also shrink. And we mostly take stuff from the backlog...
His truth about "we always know what task is most important"... eerm, often, but must admit sometimes not, and sometimes good to align with the team and prioritize?!?
And the "what do to else" is also cute: don't do backlogs unless you do it right (or what I believe is may favourite "right").. sorry full disagree and full lol.
Would more question my workplace given something the author describes, instead of telling the internet how to do backlogs (:
A lot of times a decision is to not do something at that time. In my experience, the most important things involved in building a software product is what you decide not to do. The backlog is a knowledge base of how those decisions are made. They can be archived as needed. Decision points can be made referencing them. A year or three later when the same problem crops up, sometimes under a different name, you've got information about it. Maybe it's time. So now you have that knowledge sitting there to help new decisions.
> Backlogs exist because they’re a great way to avoid difficult conversations and shift blame away from product to engineering.
> Whenever anyone asks a product manager for a shiny new feature, for example, it’s much easier to say “you’ll add it to the backlog,” than to spend an hour explaining why the suggestion is irrelevant.
I think this tone is a little condescending, but the broader point is true: PMs, QAs, and others in the process want to feel like their voices are heard. The backlog gives them a place to express their voice. And of course, not all of the tickets immediately enter the backlog. It's a place to gently lay down bad or low priority ideas without insulting the person who filed the ticket.
I mean yes, you can use the Backlog for that, as a sort of idiot pacifier but that's basically the worst way to deal with that. Preferably you would find ways to educate those people on why their Ideas are bad or low priority so they can learn to give you better input.
Again, that's really condescending. PMs will have ideas. Some will be good, some will be bad. QAs will file bugs. Some will be good. Some will be bad. The backlog reflects the bad ideas. There's nothing wrong with that. If you feel like your QAs and PMs are idiots, i.e. you're the smartest person in the room, then perhaps you're standing in the wrong room?
The other poster isn't being condescending, they're calling you condescending.
Though the use of the wording "idiot pacifier" was perhaps a bit too strong and distracted from the intended meaning.
I'm not sure you can say no without stifling future input, or if you can it requires a lot of tact. People don't like rejection. Being rejected makes them less likely to try again in the future.
Now with regards to the backlog, if a team can develop common criteria for high value/high priority tasks and learn to reject low value/low priority tasks than they can more effectively manage their backlog and time.
"Hey, that's really difficult right now, because ____, so we'll put it in the queue for some future time."
"I'm not sure how exactly we can do that and still <do other important thing>, because ______. It's in the queue so we can think about it later."
"Doing _______ seems to create a significant problem in ____________. Maybe there's a better way. In the queue."
This way the person doesn't need to be told an outright "no" or back down; they can save face and have time to change their mind. Similarly, the idea is preserved so that if these reasons weaken or we come up with a better idea about how to do it, we can move forward.
Finally, you preserve the concerns about the idea. Then, if you're not there when the idea is brought up again, then they can encounter it already-in-the-backlog with the concern/problem.
As the author found, if you tune your backlog processes they can be quite helpful. The only part of agile I use today is the backlog. If you keep engineering details to a minimum (or limited until it reaches the top), items brief and to the point, and have it groomed regularly so it is always bounded to a size it works well.
I find that on multi year projects you can “archive” the bottom 20-50% of tasks and no one will care. So it cleans itself up quite nicely.
As long as you don't do what a lot of open source projects do and use stalebot to lock old bugs with no ability to reopen them.
Mostly my experience is QA opens bugs and engineering opens tickets for tech debt, refactoring, performance improvements, reliability improvements, etc..
The PM opens new feature tickets, prioritizes those, and pushes the bugs & tech debt tickets to the backlog until their back is absolutely against the wall.
Every so often a VP or someone will come in and call PM to the carpet and engineering gets to do a "quality release" where bugs are fixed and tech debt is cleaned up. But then things will regress again to PM just making sure new features are ticked off at the expense of other tasks that languish in the backlog.
In my current work experience, this means having a fairly deep mental model of how a given refactor might impact various seemingly unrelated efforts, and knowing how and why to advocate for them. This advocacy doesn’t translate into a literal ticket (and that’s not how my team manages all work items and their prioritization), but it definitely translates into “I’ve identified a specific unit of work which doesn’t immediately serve these goals, but would broadly improve their velocity and success.”
Next to no one wants to hear that kind of advocacy, because their Babel Fish generally formulates it as “stop or slow immediate progress for abstract goal”. But that’s what the debt part of tech debt is: you have to sometimes prioritize getting out of your own way before you can move forward in any direction.
As far as performance as a feature and corresponding request, sometimes you need far too much technical detail to even know what to ask for. I’m saying this having just landed an optimization which completely obliterated the existing Y axis on one of our monitoring systems. There was some vague sense of where some of the optimization target might be, if users or even the team were able to make the connection. It took dedicated time just profiling a bunch of fixtures, without anything to go on besides “some stuff is slow, for example ___”, to understand the broader performance story which went well beyond known bottlenecks.
Part of being an engineer is, or at least should be, some freedom to dive in to make these kinds of connections independent of specific features and specific detailed feature requests (performance or otherwise). Even if the only “work product” is just a report on what you found, at least it might be cross-referenced for when it does correlate to specifically ordained work items.
Yeah it shouldn't be like that but in practice that's the only way it happens.
The older it is, the more likely a newer ticket was created for it as well to be sure
However, claiming that bugs would be a feature after 3 months and can be closed is not my experience at all. We do fix bugs that are much older. They have been annoying for a longer time, but eventually we are happy to get them fixed.
Now one could say our problem is that we are not agile enough. Well, I have seen many processes in more than 20 years of software development. They all had one thing in common: In one way or another it was a mess. Sometimes people are working more or less productively despite the mess. And sometimes they don't. It depends on having the right people and the right spirit. The process won't save you, but a stupid process will spoil all spirit and good people will leave.
Car analogies, fun, usually a bad idea. But if we're going down this path the right analogy is not to produced cars, but to produced orders for cars. Backlog tasks represent wants/needs, not a finished product sitting idle, which by analogy makes them akin to car orders from customers.
Having an unfinished and ever growing backlog means that, in the best case, you have more dreams of features than you can handle (not awful, but bad if you don't prioritize or have a clear objective for the system). In the worst case, it means you have crappy, buggy software and are too busy keeping it alive, or attending to creating more broken features, to fix it (this seems to be more common).
If the list isn't there, someone still had the ideas. I suppose the author thinks ideas are waste, too.
There's no reason it should ever shrink in this kind of setup. The careful open/close visibility separation throughout seems to keep things at ease. We are almost at 20k closed issues, so I feel like any cracks would have formed by now.
The process for searching the "backlog" is about as simple as you might think. All you have to do is constrain for 2 things. Moving something from backlog to triage is literally 1 click.
Depending on how organized your software factory is, this stuff can become pretty magical.
Therefore I can generate a personal backlog at a certain rate, and the requests are tossed into a queue that's common to the rest of my team, and waits for a senior member to investigate and sign off and direct us for the next step.
My backlog grows as a certain percentage of the tasks I take on in a given week, and so it's proportional to the volume of incoming tasks in general. The backlog is cleared at a rate based on how much bandwidth the seniors have to process them, and there's only about 2 who are responsible for this aspect currently.
So my backlog tends to grow and shrink, and it really shocked some other coworkers when they found out how deep it was!
Sometimes the only way to shrink my backlog significantly is for me to stop working altogether until the seniors have a chance to catch up. I am, by far, the most prolific generator of requests compared to my coworkers, and I'm not sure whether that is a function of the percentage of tasks I take on, or if I have a much higher rate of flagging stuff than all of the rest put together.
Anyway, there's no way for me to avoid generating this backlog. It's just a fact of life. So we deal with it. It's overall a good thing that we catch these things and filter them properly, even if it delays resolution by a few days apiece.
Everything beyond that was meaningless. They would no longer be important (for a myriad of good reasons) or look completely different when we got to them.
Possible solution: theory of constraints
Happens to me quite a bit actually. There's a huge crunch of features that need to ship yesterday, followed by a lull where I pick up boring tasks like "documentation" or "unit tests" :)