My attitude to configuration? It's too often done poorly and too casually - increasing TCO as users try to grok 100s of configurable values. Add configurability (soft coding) only when proven necessary.
When it's necessary ... A configurable value ought to be treated with the same mistrust as user input, and provide lucid error messages when input is bad. Most components should be isolated from the configuration infrastructure - just as you isolate most components from any data access infrastructure. Once isolated from the configuration infrastructure, you can and should test how the component handles various "input" from the configuration system. Most important, the program should work just fine with an absolute minimum of configuration.
However, this type of anti-pattern is extremely common:
File.Open(configuration["widgetsFileStorage"] + "/" + widgetImage)
Or this (would you ever put user input directly into an href? I wouldn't. Somehow, many people trust configuration values far too much ).
LinkWriter.href=configuration["supportUrl"]
When to configure? As you prove you need to. Good separation of concerns will make it easy to make a value configurable at a later point. I'd drop responsibility for locating a file into a file locater.
File.Open(new WidgetFileLocater().GetUncPath(widgetImage))
Somewhere behind my file locator I might or might not refer to a configuration file, a database. I'll probably start hard coding to a "images" directory in the application directory. Configuration comes when we have a use case for flexibility (someone wants to put it on SAN?) but not before. Anyway, most of the app should not whether it's configured or not. I'd likely use some dependency injection on the file locater to verify that it correctly handled lousy input from the configuration file.
Also: Configuration is almost always loosely typed, not compiled, and thus much more dangerous than code. This risk is rarely respected by developers (but heavily respected by sysadmins). I've debated using a script language like python / ironpython / boo for configuration needs. I'd get the ability to change stuff after compilation, with a much more free syntax and type checking than xml or text.
Caveats: My attitude assumes an iterative release cycle. If you have a 2-10 year release cycle, like Microsoft, you'll want to bias in favor of configuring many more values .