I know that people always have a mental model of how something works. But it's rare that somebody actually stops to consider whether their mental model is accurate or logically consistent, and unless they do, it is neither. If your mental model of a piece of software is self-contradicting, then it obviously can't reliably tell you how to use the software.<p>There's a lot you can do in designing a user interface to try to make sure that the user develops an accurate mental model, but it gets harder as the software gets more complex and more powerful. A car's controls are a pretty good abstraction of it's drivetrain, but most of the complexity of a car exists for the sake of efficiency and increased power, and it's a physical, observable system anyways.<p>I think that once a piece of software becomes Turing-complete, it is impossible for user interface affordances to lead a lazy user toward an accurate mental model. After all, to program, you have to be developing a mental model of what you're creating, <i>within the context of the programming environment</i>. That's two mental models that both have to be accurate, and one of those can't be anticipated at all by the user interface designer.<p>Programming is inherently harder than almost any other thing we do with computers. If a piece of software is Turing complete (and thus subject to tinkering), then the mindlessly-easy-to-use subset of it's capabilities can't be Turing complete.