• I came from an environment where each customer has different and evolving customization needs. The application was designed in such a way that each customer can demand their own mix of feature set. The approach was to include everything in each release. Custom scripts were maintained at each customer's site (within the database). Paid custom features were enabled by a license key.The feature set mix is transparent to developers - they only need to write code. Deployment team would alter the feature set as new or new custom features become available.  As for the feature set, there was a default feature set that everyone needs. On top of that, customers can define their own mix. Every feature set can call another set using a 'include'. Of course, duplicate features fro the 'included' feature set will be overridden.

    No matter how thorough you are in the design phase, sooner or later you run into situation that demands exception handling. So it was not unusual to see customer name hardcoded into a script (we had to check installation code, which is based on customer name) that get deployed to all customers during product upgrade. As long as it didn't break anything, we had never had any complaints.