In my current job, I worked extensively with clients both internal and external to our group. It started as an interesting job, but steadily got more and more difficult as time went on due to the multiplicative tendency of our applications.

We would initially build an application for one client. After the bulk of the development was complete, a demo of the beta application would happen for another client. They would love the new system but of course would need some “small tweaks”.

We would deploy the initial version for them and begin on the “small tweaks”… which always worked out to be much larger than expected. This was stressful, but understandable and expected. The end result of this was to now have TWO versions of a similar-but-not-quite-the-same codebase both of which had to be supported. As time went on, development continued, and critical bugs were found, production and development would have to be maintained separately. What now started as one version has blossomed into four. Then another demo would occur. Sometimes this would be to a new client (and create versions five and six) and sometimes it would be of one of the “small tweaks” to one of the existing clients.

On one of my projects there, I saw this need far in advance and purposely built the system to be aware of various modules, user roles, and particular procedures. After nearly 4 months of development, successful demos, and near completion, I was directed to remove this logic and build separate applications.

Our leading application – which was quite impressive by the way – had at least 10 versions of varying complexity, built by various developers, for a variety of scenarios. None of which were compatible.