One of the most consistent misconceptions about programming is the idea that such activity is purely technical and completely exact in nature, like math and physics. Computation is exact, but programming is not. The first is a result of a machine operation, and the latter is still a human activity.
Programming requires a lot of creativity, on top of the abstract concepts, tools and techniques that we might learn in a classroom; all that theory represents only a tiny portion of what is necessary to “build” a great developer.
For me, an exceptional developer must have the following characteristics in perfect balance: technical knowledge, curiosity, creativity and experience.