This is part of ExpertCodingSkills.
The best programming interfaces don't happen by accident: they evolve over time. The best way to "discover" a usable interface is to try it out in real scenarios, and change it when it fails to meet expectations.
This means that interfaces and designs in general can't be specified. They must be prototyped and refactored until they are deemed acceptable.
There are several factors to mention here:
Time to market -- you can't prototype and refactor forever. Eventually, an interface must ship, regardless of its imperfections. It's highly likely that your interfaces will eventually be replaced by newer ones, either by a competitor or a more experienced version of yourself.
Everyone has their own opinions and needs. Therefore it's a good idea to share design thoughts and prototypes with a diverse population, understanding that not everyone will be completely happy with the beginning or the end.
Get code into a test environment as soon as possible. This will reduce configuration and setup headaches at the end of the project when time is short and nerves are frayed.
