Programmers create software that is designed to be used by people. However, people come in all shapes and sizes, and vary drastically from one another. So it's very difficult to create a piece of software that can be used by everyone -- yet that is usually the goal when creating an application.
UI designers have to walk a fine line between giving the user a ton of control, and having the software hold the user's hand. For instance, there are times when you are really hungry for a cake. You can certainly go to the store, get cake flour, sugar, eggs, vanilla, etc and make any cake you'd like. Then you have to make the frosting as well, so back at the store you need to get confectioner's sugar, cocoa, etc. In this case, you have tons of control. But sometimes, it's nice to not have to do all that work -- just grab a box of cake mix, put it together and spread on some pre-made frosting. In this case, you have less control over the cake, but it's easier to make. In either case, the user is able to accomplish their goal -- the difference is in the degree of work they had to do to accomplish the goal.
Generally speaking, users are willing to invest the time to learn how to get the most control over the main tasks your application provides. Since they are going to be doing these tasks over and over again, efficiency and control are key to achieving their goal. Also generally speaking, the tasks that the user does less frequently need to provide good short-term benefit to the user. They're not willing to invest a ton of time learning how to do something they're only going to use once. Back to our cooking example -- someone who bakes cakes for a living is going to invest the time to learn how to make a great cake from scratch. On the other hand, a busy bachelor is more interested in the results than the process.
What this tells you is that tasks which are most commonly performed are the ones which need the least amount of hand-holding. This is the main purpose to your application, and so a user is going to want to accomplish it quickly and have a lot of power to perfect the end results. But the tasks which are done infrequently can make good use of hand-holding since the user is interested in the short-term gains and isn't willing to spend a lot of effort learning about it. For instance, a highly skilled architectural engineer is going to take the time to learn how to use their CAD program, but they're probably not willing to spend hours trying to figure out how to use the photocopier.
So when you're designing your user interface, keep in mind which tasks the user is going to do frequently, and give those areas the greatest amount of control. Do the hand-holding for the tasks which the user is going to do every once in a while.
A possible example of this principle being violated is WinZip. When you launch WinZip for the first time, you're presented with a wizard interface which walks you thru the steps of unzipping an archive. The entire point to the application is unzipping archives! This interface will only annoy users as they learn more and more about the application since it's constantly getting in the way. Consequently, this is why WinZip allows you to turn this feature off.
Now, there is something to be said about having an adaptive user interface. For example, letting the user pick "beginner" or "advanced" mode and modifying the flow of your application accordingly. However, this approach rarely works and is generally a cop-out. Most users don't know what level they are, and so they pick beginner. Then, they don't go back and pick advanced later. They don't re-pick because they've gotten used to the constraints the application has placed on them, or they've forgotton the option, or they can't locate it, or they are simply scared to pick advanced since that must be the option for geeks and other incredibly savvy people. Many times, it's best to study your application during the design phase and get a good usage profile for it. Find out what areas are going to be commonly used and what aren't. Then design the user's experience accordingly.
There are going to be fringe cases where one user does some obscure action frequently, and another user does a frequent action only occasionally. What's more, no one likes to perform customer triage. However, you have to keep in mind what the majority of your users are going to want. You can't please all the people all the time, so try to please the most people most of the time. You have to remember that if you hold the user's hand for actions they perform frequently, then they are going to feel like your application is holding them back and getting in the way. But if you don't hold their hand for the infrequent actions, they're going to feel confused and scared. What's worse, they may even feel dumb. Either case is a bad situation to be in because it makes your customers angry. The best way to solve the issue is with research into the usage patterns for your application and providing the "right" amount of control for the various tasks it performs.
I don't agree with your take on the "beginner" versus "advanced" settings. I have picked advanced mode on some of my software. It all depends on the particular program. A program that's always being used for one task by the user will be less likely to have its advanced features activated, and a preferences setting will suffice for any customization. A program that is meant to be flexible is oneI'm more likely to use in the "advanced" mode because the "beginner" mode is too constricting.
Wizards are overused. A better approach is to allow the user to take some of the features of the "advanced" settings and _modify_ the behavior fo the "beginner" mode with them; that is, retain the easy automation of the "beginner" mode but with control over the operations it performs.
One simple distinction between "beginner" and "advanced" might be whether or not the user wants help notes implemented. I want to add an option to show or hide help in REALbasic but gave up trying. Am I correct in presuming that there is no simple way to do this? Too bad, I'd say.
While I can appreciate the analogy for the cake, the mix had better give a pretty reasonable cake or a person ends up feeling like "If only I had done it from scratch". If doing it from scratch is cut off then the whole exercise leaves the user feeling frustrated and unsatisfied that the cake mix did not live up to it's billing.
If you provide the cake mix make sure it makes good cakes.
A UI is not to dissimilar.