We had a feature to implement at work. A small concept needed some code wrapped around it. There was a very basic and obvious way to do it. The one nagging thing was that it seemed a bit off to the side from everything else, a little thing stuck on with glue rather than a natural part of the greater whole.
As we thought about the concept and things around it, some interesting and very flexible extension ideas came up. Things which could be done that both seemed simple to reason about and potentially very powerful, all without needing any additional settings.
I did some code experiements and played around a bit. Then we talked some more, refining the ideas and how to do them. It was all very nice and simple thanks to the iterations.
At the same time, the actual users did more work and thinking on their own. When we came to them and presented our refined ideas, the extra work they had done clearly and decisively proved our concept was not actually solving the real problem. In fact, that basic and obvious solution was pretty much the only option available right now which did.
This is the way development should go. A lot of concurrent thinking, a lot of avenues explored and very little code written in the final result.
The extended ideas may have other uses in the future. We also have ideas and questions what to do around the solution.
Hopefully they too will be both refined and discarded a few times.