In my previous job, reuse was a selling point to our clients. We promised that building the current system will produce components that will help build the next system at a lower cost. A noble goal.
Here’s what happened: we spent a lot of time designing for all the future needs of the component. We then implemented and had some integration issues, because, generic as it was, it didn’t fit the current system. So we fitted it to work. Later, when a new system came, we had long discussions on why the previously though generic component is no longer so. Then we branched it. And so on…
Until Microsoft came out with a new .Net framework.
Then of course there was no use for reuse. We just wrote a better generic component in the new framework. Rinse, repeat. And needless to say, the first components were still maintained in their respective systems.
The goal of lower cost was not achieved. Yet the mad race continued. You know why? “Because next time we’ll get it right”.
No you won’t. Stop trying to catch all the balls in the air, including the ones that are not there yet. Concentrate on the problems you have now, and solve them. It will cost you less. And your client will not think you’re playing them.