views:

270

answers:

6

My company is floating the idea of extending our version numbers another notch (e.g. from major.minor.servicepack to major.minor.servicepack.customerfix) to allow for customer specific fixes.

This strikes me as a bad idea on the surface as my experience is the more branching a product does (and I believe the customer fixes are branches of the code base) the more overhead, the more dilution of effort and ultimately the less productive the development group becomes.

I've seen a lot of risk vs productivity discussions but just saying "I think this is a bad idea" isn't quite sufficient. What literature is there about the real costs of becoming too risk averse and adopting a heavy, customer specific, source code branching, development model?

A little clarification. I expect this model would mean the customer has control over what bug fixes go into their own private branch. I think they would rarely upgrade to the general trunk (it may not even exist in this model). I mean why would you if you could control your own private reality bubble?

+4  A: 

Can't help with literature, but customer-specific branching is a bad idea. Been there, done that. Debugging the stuff was pure hell, because of course you had to have all those customer-specific versions available to reproduce the error... some time later, the company had to do a complete rewrite of the application because the code base had become utterly unmaintainable. (Moving the customer-specific parts into configuration files so every customer was on the same code line.)

Don't go there.

DevSolar
+2  A: 

In my travels I haven't personally seen any definite literature for most of the good practices, although I suspect that there is a lot of stuff out there.

Versions numbers provide a really simple mechanism to tie back specific versions in the wild with specific sets of code changes. Technically, it doesn't matter how many levels are in the version number, so long as the developers are diligent in insuring that for every "unique" version released, there is a "unique" version number.

Logic dictates that to limit support costs (which are huge, often worse then development ones), a reasonable organization would prefer to have the least number of "unique" versions running around in the field. One would be awesome, however there are usually quite a few in the real world. It's a cost vs. convenience issue.

Usually, the first number indicates that this series of releases is not backward compatible. The next number says that it mostly is, but a few things have changed and the last number says some stuff was fixed, but the documents all hold true. Used that way, you don't need a fourth number, even if you've done some specific fixes at the request of a subset of your customers. The choice to become more client-driven shouldn't have any effect on your numbering scheme (and thus it's a bad idea).

Branching based on customer requests is absolute madness. One main trunk is essential, so each time you branch it creates massive technical debt. Branch enough, and you can't afford the interest anymore...

Paul.

Paul W Homer
A little clarification may be needed. I believe the intent of the customer specific branches it because our customers dislike upgrades to a new trunk version of the product with everyone elses fixes. They really want to reduce risk by only getting the fixes for issues they have raised.
Syndrome
That's a little scary, in that you'll have a large number of versions floating around each with some arbitrary (and unknown) set of fixes. Isn't that an exponential leap in complexity?
Paul W Homer
You'd probably do better to implement some type of module scheme, and then version each one separately (and make sure that failures don't cascade). It'll save a fortune in support costs.
Paul W Homer
Interestingly enough we are going to OSGi to implement this sort of model.
Syndrome
If the clients can pick a subset of fixes, won't you need a 'set' of version numbers? Unless you going to split things in the repository (or code) and then map it back to unique numbers ...
Paul W Homer
+1  A: 

I agree its generally the overhead to handle customer fixes is high, but I wouldn't say don't do it.

I would say charge the customer an arm and a leg (and them some) if they want that much attention. Otherwise don't do customer branches.

Pyrolistical
Good point but then we would still need to quantify the cost to know what "an arm and a leg" is. :-)
Syndrome
+1  A: 

You describe the changes that go into the customer branch as "fixes". Because they are fixes, I am assuming that they will also be made in the trunk and are really just advanced deliveries of future bug fixes. If this is the case, why not just create a new "servicepack" (from question: major.minor.servicepack) and give that version to the customer.

  1. For example, you release version 1.2.3.
  2. Customer #1 needs a fix, create version 1.2.4 and give it to Customer #1.
  3. Customer #2 needs a fix, crate version 1.2.5, give it to Customer #2 and advertise that they also get interim fix "for free".
Alex B
I think the intention is that the customer ends up controlling their own branch and never transitions back to the trunk. I mean why would you when you could control your own little bubble of reality?
Syndrome
+1  A: 

Not sure about the literature but... if there is even a chance that you are supporting customer specific fixes it seems sensible to at least have a branching and versioning strategy in place. Although I would be hoping for the strategy never to be used.

I guess the danger is you end up with a culture where customer specific fixes become acceptible and the norm, rather than addressing the true issue that resulted in the need for the fix.

I guess the real cost will largely be dependent on whether its just an interim bug fix to keep a customer happy prior to the next release or whether its more of a one-off customisation. If it is just the former, and the quantity isn't too high I wouldn't be too woried. However if its customisations i would be scared witless.

Jackfu
I guess the point is that the customer would likely never move to the trunk, they would just continue getting bugs fixes and small development done for their own purposes and we would have to support their branch indefinitely (let the witless scaring begin). :-(
Syndrome
A: 

If you can find a way to compile your one product and turn on each client's features on/off in their "configuration" of a central build that might be something worth figuring out.

Something like this might best be done through a profile/config/role based setup.

You may have to secure one set of client's customizations from another, or maybe they can all benefit from it. That part is up to you.

This way you can build custom views, custom codes, custom roles, custom code, whatever. But, they're a part of one project.

Do not maintain multiple codebases of the same product at any cost. I did it once and doing an hour change takes at least 1 hour for each system if it's in the worst spot. It's suicide.

Do share what you end up doing!

Jas Panesar