I've been reading Pragmatic Thinking & Learning by Andy Hunt, which talks a lot about experts. In particular, he discusses the Dreyfus model of skill acquisition, and describes experts as having "…a vast body of experience that they can tap into and apply in just the right context. … These are the modern wizards."
Maybe on a good day.
I could probably be considered an expert in software development, and I am able to write code that is solid and doesn't usually need to be revisited. I think, though, that this isn't so much based on any wizardry but rather just a willingness to deal with all the details.
I'm beginning to think that the main difference between the 'expert' and the 'advanced beginner' is a dogged practice of attending to the boring, simple stuff. On a good day I get to play with big ideas--system architectures, user models, communication protocols. Most days, I'm making sure my initialization code works in all the possible cases, my event handling code makes allowances for all the vagaries of user activity, and that my platform classes support all the known use cases.
Our industry doesn't have much institutionalized appreciation for low-level craftsmanship. That's unfortunate. It's harder to feel satisfaction for a small, well-written piece of code that no one will see directly, but it's the focus on making absolutely sure of the foundation that lets us build larger structures and explore new ideas--that lets us have more good days.