The agile way of ensuring level flow is via slicing of the backlog. However, this is not easy to do. We do spikes to learn more and then use that information to create roughly equally sized chunks of stories. I think this is where the struggle is. Uncertainty freaks out people and we go back to what we know – try to figure everything up front before starting the work. Of course, that does not work either. What is not well appreciated, is that, slicing the backlog is one of the key criteria to be agile.
I think the reason why we struggle is that we have missed another key piece to be agile – learning. Running spikes (experiments) to learn more, which in turn helps us to un-bundle, a need into chunks; which, when built chunk by chunk, indicates predicable progress to the customer. We may sometimes do this instinctively, but we may want to be methodical about it.
Why do we need to learn? Because there is no perfect solution. There is only a possible right solution given all the constraints (time, money, limited understanding, unpredictable future etc.). The customer, the development team have to discover this right solution. And that can be done only by experimenting, which leads to learning.
Once we let go of the myth of the perfect solution and the unhealthy assumption that we will get it right the first time every time, we can can start looking at solving problems as a never ending series of experiments. And therein lies the crux of continuous discovery.