Feedbackmaxxing – Codemanship's Blog
Skip to content
You know the TV gameshow Play Your Cards Right? Contestants are shown a sequence – in two rows – of giant playing cards presented face-down. The host turns over the first card. The contestant then has to guess if the next card is higher or lower than that one.
They move across the board, guessing and then revealing one card at a time until either the contestant guesses wrong or they complete the sequence and win the game.
Now imagine a version of that where they don’t turn the cards over until the contestant has guessed higher or lower for the entire sequence.
"That’s just silly, Jason."
You’re absolutely right. It is silly. Very silly. The odds of winning the game would be so remote that we’d probably never see it happen.
So why are you developing software that way?
Be honest now – you are.
You don’t turn the cards over one a time. You make a whole bunch of guesses about what the users or the business really needs. Then you make a whole bunch of design decisions that may or may not be the right decisions. Then you make a whole bunch of changes to the code that may or may not work. And only then do you turn the cards over to see if all those many guesses were good guesses.
Every decision, and every change to the code, carries uncertainty. And that uncertainty compounds with every subsequent decision or change. If we have a 90% chance of getting one right, we have an 81% chance of getting two right, a 35% chance of getting ten right, and 0.003% chance of getting 100 right. The more uncertainty accumulates, the longer we spend driving in the dark with the lights off.
These decisions and these changes don’t exist in isolation. One decision is often a consequence of an earlier decision – another junction along the way of the path we chose. One change to the code will constrain our choice of future changes.
If we take a wrong turn with any decision or any change (which is just another decision, really), how long can we afford to waste heading down the wrong road? How long will it take and how much will it cost to get back on the right road?
The further we go before we get a meaningful answer, the bigger the wasted time and effort, and the more it will cost to correct.
And this is where sunk cost enters the chat. When the cost of correcting a mistake is too high, teams will tend to choose to live with the mistake. Waddayagonnado?
And that’s how you make software, that is.
A smarter way is to turn the cards over as they’re being played. Test your guesses against reality as soon as possible, so the next guess is less likely to be a stop on the wrong road.
If you guessed wrong, no problemo. Correcting your mistake is quick and cheap. You don’t have to undo 100 decisions that followed, then make 100 new ones.
So a critical metric in software development is how long it takes for us to test our decisions after they’ve been made. That feedback latency needs to be as low as possible.
I’m now calling this approach feedbackmaxxing , because that’s how we talk these days apparently.
Feedbackmaxxing is maximising feedback frequency while minimising feedback latency across the entire software development system
This is about two variables we can control in our development process:
Batch Size – how many decisions need feedback (e.g., from testing, from code review, from users) at a time?
Feedback Frequency – how often do we get that feedback?
The bigger the batches, the longer it takes to get feedback. The smaller the batches, the sooner we learn what works and what doesn’t.
The smart players work in small batches – they solve one problem at a time – and engineer their feedback loops to be very fast.
Software development cycles are loops within loops. We have that outer loop – will a reminder to reorder a prescription reduce missed doses? And we have the inner loop – did that change I just made to the code work? Did it break anything that was depending on it?
The smart players know something about how to optimise nested loops, too. They know that to speed up the outer loop – the real-world user feedback from working releases – you focus your attention on the innermost loop.
How long does it take to build and test the software? If the answer is an hour, you have a big problem. Your choices are not great – you can either test one change at a time, and spend most of your day waiting for feedback. Or- and this is the most popular choice – you make a lot of changes, and then test them, in the mistaken belief this will save you time. "I’m too busy building on top of broken code for testing!"
The other systemic effect that large batches has is – because they take longer to get feedback on (reviewing a 5-line diff vs. a 500-line diff, for example) – changes tend to end up sitting in queues waiting their turn.
Make the batches bigger, the queues get larger, and delays get longer. The more decisions we make before testing them, the slower we get...