You can read 100′s of books, listen to countless podcasts and read documentation and blogs, but nothing replaces actual doing when learning to program. The repetitive nature of coding -> compiling -> running -> troubleshooting -> fixing and trying again seems to be the key for me in learning new programming languages and platforms. This is how I learned to develop apps for the web over a decade ago, and lucky for me what I learned toiling away in those days is still largely applicable today (i.e. the fundamental nature of how the Internet works has not changed).
This learning paradigm works well for programming, but it can also apply to other disciplines. The key is to figure out how to iterate often, “debug” your failures and try again. In the same way that consistent weight training builds muscle tone, exercises of the mind have the same effect.
My son joined the chess club at his school and has (at 6) mastered the mechanics of the game itself; which pieces can move in which directions and the general rules of play. Now he is learning the strategy. To assist his learning, I’ve given him the freedom to “take back” moves as a way to facilitate rapid learning. He makes his move, we play out the scenario together, then he has the option of trying something different once he understands consequences of the move.
It’s the hands-on experience dealing with small failures that is so important in learning. The more rapidly we can physically see the consequences of our actions, the quicker we can adjust to compensate.