Let me say at the start that, as I write this, my experience is not that diverse, nor am I highly skilled in all the languages I've come into contact with yet. In the order I learned them, I know QBASIC, C, DrScheme, and Java. And, uh, Tierran. So when I say "imperative", I'm speaking from my C experience; "functional" refers to my DrScheme nightma., er, experience, and "object-oriented" means Java, along with what I've heard about C++. My background in particular: QBASIC from early childhood to middle school or so. C starting after high school senior year. DrScheme in Caltech CS1 and CS2, freshman year. Java in CS3 the final third of freshman year. .
So, what programming philosophy is best? One of the main things we desire in a programming language is being able to do stuff. Raw assembly offers no structure and is quite crocky and nonportable, but it's fast and powerful, and for this reason tight inner loops are often coded in assembler. (Whether they need to be is a topic for another time.) It's said that C combines all the power of assembly language with all the ease of use of assembly language, and C is indeed not a very high level language. It does offer much richer structure than assembler, of course, which is why I like C, and I haven't been daring enough to learn real assembly let. .
The problem is, of course, that computers and their programming languages are too powerful. Computers work with so much input and data (which you usually can't make very many assumptions about), so quickly, and can do so many things to them, that humans really can't picture all at once everything that happens. What happens when we overdose on power? Bugs. Memory leaks, general protection faults, crashing, instability - all of these are due to programs doing stuff they shouldn't. A programmer is at fault if he causes this stuff to happen, but a good language ought to guide the programmer into using power carefully, without restricting (too much) his abilities.