This occurs most when people try to make a software too flexible then it should be. Those keep saying they may need to serve in an another format; serve in a different platform/technology; but these never happen.
Requirements and technology changes rapidly; it is our job to be synchronized with them. Business wants development teams to be agile. For this reason, we have been populated our code base with:
- interfaces (that has only one implementation and will never change),
- design patterns where we do not need them actually (strategy pattern with one strategy)
- aspects where actually a simple web filter was enough (debug became harder; great)
- targeting high unit test ratios caused unit tests testing only order of method calls with mock objects
- useless documents
- too many configuration files (that never change)
- pages of spring beans; every developer will debug again and again
In order to be agile for business requirements; we should not forget two things:
- the language should be agile in nature (see few words on ruby)
- the team should be agile which is more important. To make team agile we need to be sure that the code is easily read; understandable by new joiners (where in IT world; recruitment occur more). Sometime it is better to do copy&paste code then a series of design patterns if team says replace all is easier. (and I doubt if it will ever needed.)
Requirements and technology changes rapidly; perhaps a design / software done five years ago is nearly dead and you think it is time to build it again with different technologies. Follow technology and use it; but do not lost yourself inside it; do not be obsess with being too flexible, technology and patterns. Check your old projects; don't you have a great new plan/design for those?