I want to touch on one of the most basic and fundamental issues of configuration management that developers have to deal with. A common question addressed early on in a project is: Do I need to branch this software and maintain a parallel version? A common answer is: Well, if it's not upward compatible.
I like to look at things the other way around and ask the question: Is it upward compatible? Then the answer is: If we don't need to maintain a parallel version.
Upward compatibility is not an easy term to define. I can give you a hundred definitions that might work but don't. Consider these. It is upward compatible (UC) only if:
· It doesn't change the user interface
· It runs on the current hardware
· I don't have to convert or reload the database
· It doesn't de-stabilize the build
· The documentation doesn't have to be changed
· It supports the same message protocol
And so on. There are a lot of seemingly good candidate definitions and they're not bad considerations. In fact, they're very good. The problem comes when I go back to the original question: Do I need to branch this software and maintain a parallel version? Now look at the list above again. A developer takes his answer if it's not upward compatible and proceeds to branch his or her software subsystem 19 times before release 1 is even out the door. Why?