This is my “not rocket science” manifesto of GUI design. A programmer with no formal design training can go pretty far just by making a good-faith effort to adhere to these principles:
1) Reliability – There should be nothing on the GUI that will be fixed later or is a stubby placeholder for tomorrow. It all just has to work.
2) Simplicity – The beauty of the machine is that it can take complex data and hand it back to a human in a form the human can understand. Information visualization is powerful stuff. Harness that power.
3) Responsiveness – Tell the user what is going on. Tell the user why there’s a long pause. And for heaven’s sake, assume there will be errors when running external scripts and calling external processes. Plan for that and report the errors with as much transparency as possible.
4) Willingness to do the tedious stuff – The computer should make the decisions on the boring stuff (naming conventions, file locations) and the human should make the decisions on the interesting stuff (simulation parameters, creative choices). It’s amazing how many programmers get this 100% backwards.
5) Labels. Don’t assume that a user is going to magically know what that slider does. A tooltip is nice, but a label is often nicer.
6) Clean source code – Without a clean, modular design that makes maintenance programming easy, GUIs become quickly become unreliable, complex, unresponsive, unhelpful, and unclear.
I do think there’s a moral imperative to good design. We make an implicit contract with the user, and we need to do everything we can to avoid breaking it.