I learned the "cowboy" way in middle school and high school. I graduated high school making more money than my teachers; and I slept through all my classes. During college I felt I was learning nothing. However, I did learn a lot during those college years; not from the teachers, but from teacher other students myself. Teachers are taught as they were taught, but times are changing and people change. The way people learn today is not the same way that people learned 20 years ago.
So my fellow students would often come to me for answers; they all said they wished I was teaching the classes, not because I was more knowledgeable (I probably wasnt), but because of the difference between "knowledge" and "understanding". There is much I don't "know", in fact Object Oriented Design is completely new to me, I never used it before XenForo. But I have an innate ability to "understand" pretty much anything I look at. I can look, and immediately break things down and figure out it's pieces.
So how did I learn how to program? I looked at other people's code; I played with it; found out what made it work; and most importantly, found out what made it break. Because of this "kinesthetic" method, it also gave me the ability to relay it back to others in "modular" form (chunking). By explaining the pieces well, you can easier understand the construction. People like to say "can't see the forest through the trees", but the trees are easier to understand than the forest, and a lot of trees make up the jungle.