views:

268

answers:

4

I work on an application that has a both a GUI (graphical) and API (scripting) interface. Our product has a very large installed base. Many customers have invested a lot of time and effort into writing scripts that use our product.

In all of our designs and implementation, we (understandably) have a very strict requirement to maintain 100% backwards compatibility. A script which ran before must continue to run in exactly the same way, without any modification, when we introduce a new software version.

Unfortunately, this requirement sometimes ties our hands behind our back, as it really restricts our ability to innovate and come up with new and better ways of doing things.

For example, we might come up with a better (and more usable) way of achieving a task which is already possible. It would be desirable to make this better way the default way, but we can't do this as it may have backwards compatibility implications. So we are stuck with leaving the new (better) way as a mode, that the user must "turn on" before it becomes available to them. Unless they read the documentation or online help (which many customers don't do), this new functionality will remain hidden forever.

I know that Windows Vista annoyed a lot of people when it first came out, because of all the software and peripherals which didn't work on it, even when they worked on XP. It received a pretty bad reception because of this. But you can see that Microsoft have also succeeded in making some great innovations in Vista, at the expense of backwards compatibility for a lot of users. They took a risk. Did it pay off? Did they make the right decision? I guess only time will tell.

Do you find yourself balancing the conflicting needs of innovation and backwards compatibility? How do you handle the juggling act?

+3  A: 

As far is my programming experience is concerned, if I'm going to fundementally change something that will prevent past incoming data to be used correctly, I need to create an abstraction layer for the old data where it can be converted for use in the new format.

Basically I set the "improved" way as default and make sure through a converter it can read data of the old format, but save or store data as the new format.

I think the big thing here is test, test, test. Backwards compatibilty shouldn't hinder forward progress.

That's just my 2c

Fry
A: 

Split development into two branches, one that maintains backwards compatibility and one for a new major release, where you make it clear that backwards compatibility is being broken.

Ted Percival
That would require maintaining 2 streams of code, because not all customers would migrate to the new system if it means breaking their scripts. Doesn't sound like the most efficient way of working into the future.
LeopardSkinPillBoxHat
I'd agree - maintaining 2 different coding threads is difficult and prone to have errors, I'd avoid this if possible
Fry
+1  A: 

The critical question that you need to ask is wether the customers want/need this "improvement" even if you perceive it as one your customers might not. Once a certain way of doing things has been established changing the workflow is a very "expensive" operation. Depending on the computer savyness of your users it might take some a long time to adjust to the change in the UI.

If you are dealing with clients innovation for innovation's sake is not always a good thing as fun as it might be for you to develop these improvements.

Harald Scheirich
A: 

You could alawys look for innovative ways to maintain backwards compatibilty.

HLGEM