Why you don't want my source code...
We develop a commercial bug tracking system, Alcea Fast BugTrack... We've been building and improving it over the past 3 years, and while we've always been very happy with it, it's grown to be a pretty full featured defect tracking system... Occasionally, we will come across someone wanting the source code when they buy our product... We've almost always refused and I'll outline why you don't want the source code for a commercial, well maintained system... This doesn't apply to open source systems, and it might not apply to all commercial systems, but it applies to many...
- Feature Drift / Upgrade pain... Once you get my source code, and start making changes, if you're not feeding those changes back to me (as an open source system would work), then as soon as I create a patch, new release, whatever, you're either: (a) stuck with the version you bought, or (b) going to go through patch fun / hell as you re-implement / fit your changes into the new code... In our case, we're release maintenance releases at least once a month, and major releases about every 9 months... So missing a year of upgrades will mean you'll miss lots of great new features...
- Supportability... It can be tricky enough to identify specific installation issues - change the code, and without knowing what changes you've made, you're almost impossible to support...
- Wasted development effort... You don't have enough to do that you want to start making code changes to a commercial system? We want to build the best system we can, we get tons of suggestions for improvements to the system, and we can implement a feature in a way that meets all of our customers needs... We have a dedicated development team that knows the code inside and out - we've been working with the code for 3 years...
The rebuttals to these arguments will talk about what happens if I go out of business (Alcea's been in business for 7 years, is self-sufficient / self-funded, and we're not going anywhere - but you can't take my word for it...) ... At best I would recommend putting the code in escrow...
A better way to customize my system is through the ways that we define - through a clearly defined web-service and/or hooks put in place to allow extensions to the system... Just as layers of code define interfaces between the layers, so systems of code can define interfaces between the systems...