IME it is impossible to stop idiots being idiots. I have come to the conclusion that trying to butcher the API to prevent plonkers being plonkers is just never going to work. The API should expose the rich contract of the object in question. If different layers have different views of the same model, then why not use different interfaces, all implemented by the same object (ReadOnlyUser, ModifiableUser etc.)?
I am not saying that the API should expose every possible method, rather it should expose every *relevant* method for the usage of the object at that moment in time, regardless of the developer's skill.
And while I don't quite believe in "breaking legs social networking" I do believe that code is a very powerful tool, and code deserves to be treated with respect....if developer's don't get that, then sure, they need training up
