If only we knew how little we know at the start we would understand the need to delay decisions until we understand more.
I have sat in too many “design” meetings where some crazy design emerges from a bunch of unverified assumptions not to value the concept of reactive design, the value of TDD, designing on the fly with a pair, pulling in others from the team as needed, and inevitably rework. Each line of code we write is a liability and the only way to reduce the volume of code is through continuous refactoring as we learn more and the design evolves. If we don’t refactor we find we are quickly overrun with bugs grinding our progress to a sharp halt.
We make decisions only when they need to be made at which point we have as much information to make the descision as possible. And if new information is discovered, new knowledge is aquired or better ideas spring from young minds we refactor knowing that the extra work will always pay off.
Good developers are constantly learning, not just new techniques, but more importantly about the domain in which we work. It’s at odds with the traditional view that we enter a role “fully qualified” and immediately know the best solution to every problem. Qualifications encourage the arrogance that for so many years left us standing still. The only important skill is the ability to learn. Experience makes this process faster but however good we get the main focus must be on learning.