I came across a case where a programmer, to design the epitome of flexibility and user control, gave an interface to the user who could change the information schema on the fly. This automatically made corresponding changes to the backend storage and the system model, and the application just worked. However, it failed to remain usable, as the ease of modifying the information schema only helped the user in creating a lot of cruft and in the end corrupting the data. We should always design technology to give room to the user, however, with restrictions.
Software is never just a piece of code, it embodies a domain when it gets used. And restrictions are important to perform the domain validations and maintain the data integrity. We often talk about the features that makes a piece of software flexible and gives power to the users. However, features that adds restrictions are equally important to keep the software working efficiently.

March 12th, 2009 at 5:14 am
I think it depends on your target audience. Some classes of users want ultimate control, while some want just the basics they need for the moment. The perfect solution would cater to both.
A good mix is something in which it’s trivially easy to do simple things, and progressively added complexity for complex things. Something with a philosophy like Ruby on Rails.
A bad example is Asterisk. They started with a simple configuration format, but what they have now is effectively a (really badly designed) scripting language.