- Allowing the user to perform desired operations in as few steps as possible
- Without cluttering the screen with all kinds of irrelevant controls
These constraints can be at odds:
Every time you hide some feature away in a menu, you are adding steps the user has to perform to achieve what they want
On the other hand, presenting every single feature on the screen all the time just clutters the UI and makes the user feel confused
It's no good to let the user decide what goes on the UI either: you've now just burdened the user with the job of creating a UI for your application.
Other constraints:
- Make sure all features are "disocverable" by just casually playing around the UI.
This rules out the idea of "hiding" things until the user triggers some kind of magic incantation.
Command pallets and shortcuts are great ways for enabling power users to perform operations quickly, but the product must have other ways for exposing features that is predictable and boring. Menus are a great way to do this. A user casually playing around with buttons and menus will eventually discover features, and they will also eventually learn the shortcuts for them.