Wherefore, the good programmers have to leave an open design for modificating the source code without have to rewrite it all.
Yes. This leads to the current mess we called Enterprise Java.
Design by "But what if..."
"Design a piece of software to help someone walk."
"But what if they have only 1 leg?"
"What if they have 3 legs?"
"What if someone has no legs?"
"Should we support cats too?"
"Well if we are supporting cats, why not dogs?"
"Gerbals?"
"What about wheels?"
2 years later what should have been done in a week is STILL in development. The lead engineer and his favourite side kick are the only ones who understand WTF is going on in a HUGE MASSIVE death star of a frameworked application. Thousands of abstract classes, each with single implementations below interfaces.
2 years later the customer says, "We have client who uses his arms to walk."
BOOOOM!!!!!
Now the 2 week application would take about another week to change to support 2 arms. The "Death Star
TM" takes another 2 years.
The people who have to support it in the wild leave the company because it's just too difficult and they can't stand working with it.
It's consultancy 101 if you are developing an application for someone else that you can walk away from, being paid by the day, make it as complex as possible, throw the kitchen sink and the full family wedding gift list at it. Make sure only you and your team understand it. Charge by the day.
This, currently is my nightmare and it's happening to me all over again. My solution is to follow the agile process and design underneath them, get the damn job done, evaluate and move forward while they construct their Death Star.