I ran into this problem at my old job, and now again at my present one, which means I either have extremely bad luck, or am not aware of some tool or organizational system which can solve this problem.
In both situations, the end product was comprised of several independent components, each of which communicated through an agreed interface with its neighbors. The problem is that over time, the interface will change, and then the respective components must also be updated so that everything keeps working.
That in itself is not a problem. The problem is that this makes bug tracking extremely difficult when trying to go back in the SCM history, because at some point, the component you are trying to debug will no longer be compatible with the other parts of the system and cannot be tested against them without also rolling them back.
Take the following example:
- Say we have a client/server product, and for simplicity's sake, both start out in a fully-working state. We'll call these versions client-1.0 and server-1.0.
- After some amount of time, bugfixes and features are made to both. Now we're at client-1.7 and server-1.2.
- Now the interface changes in the server, so the client must also change: server-2.0 and client-1.8.
- Now with the client at version 1.9, a bug is found, and we want to test the previous versions to see where it stopped working with the server. However, if we go back past 1.8, then the server must also be reverted.
The example scenario I give is extremely simplified, but the question boils down to this: what's the best way to enforce which versions of the client and server are compatible with each other?
I have considered doing this through documentation, but inevitably, human nature will triumph and somebody forgets to update them for either their or the other component. I also thought about doing it by having matching versions (ie, when server hits 2.0, client also gets promoted), but the problem is that the client may have other component dependencies which are unrelated to the server, so it doesn't make sense to update their versions across the board.
There has got to be some solution for solving this problem. Does anybody have any suggestions, or starting points for my research?