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.