Nearly eight years and, yes, I consider myself to be good at it. I've come to find that GMing a given game can largely be summed up as 'playing to expectations' - if you give players what they expeect from any given game, you'll have largely satisfied players (this isn't to say that deviation is bad, merely that it should be justified within a given setting/premise).
Two examples to illustrate a bit more clearly:
Example 1:
You tell your players that you're going to run a Call of Cthulhu game. They will come to the table expecting a Call of Cthulhu game - mad scientists, eldritch evils, inbred hillbillies, madness, death, and all of that. If you deliver, they'll be happy. That's playing to expectations.
Contrast that with...
Example 2:
You tell your players that you're going to run a Call of Cthulhu game. They come to the table expecting a Call of Cthulhu game - mad scientists, eldritch evils, inbred hillbillies, madness, death, and all of that. During the second session, you introduce giant, sentient, transforming robots from the planet Cybertron (yes, those robots). Your players will hate you for promising them one thing and giving them something else entirely different.
Bait and switch GMing is crap. Absolute and total crap. It is easily my biggest pet peeve as a player (and from experience, I know that I'm not alone here). If you tell your players to show up for a game of X, then you damn well better be running a game of X - not some horribly inappropriate fetishist mutation of X, Y, and Z. This is the biggest lesson that I have learned in eight years of running many different games.