In my project, we use lots of configuration files. These may be ordinary property files or xml's (note project is done in java). Initially many of the configuration files seemed useful as when you want to change something, you just have to change the config file and dont have to rebuild the whole project (useful in production). We've had many phases in the project. Most of the design decisions need to be extended for the newer phase as it contains more requirements on existing things. This meant discarding some of the configuration settings and writing something new again. These configurations become some new "mini language" in our project. Whereever we find something hard coded is "externalized". Nowadays it looks like everywhere we are trying to "externalize" things. Some of the things cannot be generalized enough, so we might need to tweak somewhere here and there (note the project is a business solution, so lots of special cases etc so cannot be generalized much). Now our coordinator somehow likes databases. He wants anything and everything to be put in database. So lately we've seen most of config files moving into tables.. with fuctional depedencies between them. His argument is that we should be able to change something in production without even having to redeploy. I think the whole scenario is ugly. If there are logic which need to be externalized, what will we do. Interestingly we use JRules (a rule engine) for our project. I dont have much exposure to it, but we can embed logic in it. The problem.. not everyone is good at it, and its slow (more need to be investigated).So again we dont use it for configurations. I thought of moving somethings to Jython (if its possible), but worry finally that project will become a sphagetti of Jython + Java + again simple files. And all these things maybe worthless because in next phase some new case will come which will break these things. Strangely everybody here likes reflection a lot (especially our coordinator) .. you will find what class, what method(!) to invoke etc in database tables . These can be easily done using Interfaces in java (not required in python because of ducktyping), but they dont care.
All these things taught me that dont externalize something unless its absolutely necessary.