Everybody understands what settings are, more or less. Every computer user is going to stumble upon them, eventually. But the user does not always end up a winner in this encounter. There are 3 major problems to tackle: it's hard to find the right setting, the required setting does not exist, and it's unclear what this or that setting's responsible for.
To understand this, let's first think about the origin of settings. In theory, settings provide a way for the developer to adapt a program to a certain use case. The users are different though, one wants it his way, another demands her own, and even though the differences are miniscule, the decision is left up to the user. As a result, you must know about user tasks and their goals to create the right settings window.
That's the theory so far. What about the practice?