From an insightful comment on a Slashdot post :
If complex software is to be used by inexperienced users, we as software designers must first accept the fact that the users are neither dim-witted nor incapable of understanding complexity. They are simply not intimately familiar with its every nook and cranny. The duty of the software designer is to make complex functionality usable. Be smart about context: only display options that are relevant to the situation. Choose smart defaults and explicitly highlight common configurations. Help shouldn’t be an afterthought or even solely contained in an external help file; the software be clear what will be the result of a particular choice. Account for bumbling or exploring users and mistakes: make every action reversible. Error messages should be descriptive and actionable, suggesting probable resolutions.