Too many programs are complicated. The prevailing viewpoint seems to be that the programs need to be complicated to have a wide feature set. Why, however, is it not possible to have both simplicity and complexity? Or rather, why is it not possible to have simplicity and flexibility?
The truth of the matter is that everything can be simple. A program might be terribly complicated and use tons of super-advanced formulas, but that program can always be broken down to one of the simplest (if difficult to use) languages: assembler. Assembler has a very small command set. How is it possible for such a language to allow so much flexibility?
The key, in my opinion, is for applications to be layered. This is already true for the frameworks for most applications; high-level elements are based on lower-level ones. The higher-level elements, however, usually lack some of the flexibility of the lower-level elements.
Thankfully, possible to expose all levels simultaneously. Use the top level, and it will be easier to accomplish the task. Use the bottom level and it will be more flexible.
Too many GUIs don't seem to understand this. They either expose hardly any options, restricting the user greatly, or expose all features at the same time, overwhelming the user with options.
Why not layer the features? Why not allow both high-level and low-level features? Use keyboard shortcuts to quicken the lower-level tasks for advanced users, and make the shortcuts modifiable. Expose the more complicated features through intuitive methods if possible - perhaps they aren't actually as complicated as they seem. Most things aren't.