I kinda think that everyone learns differently to some extent, and that there isn't one universal "best way". So what worked for me, or anybody else, might not be right for you... so take this with a grain of salt.<p>My preference is to just pick a project and start hacking, and force yourself to learn what you need to know to complete the next step of the project. I think it works better if you are actually enthusiastic about the project, but just picking something "at large" to have a focal point is fine.<p>It doesn't have to be something big and elaborate, especially in the beginning. You don't need to say "I'm going to write a Facebook clone" right away. Start small, but grow it as you learn.<p>Maybe you just want a program to randomly generate D&D characters or something. Fine. Write that as a command line program. Then come back and slap a UI on it using wxPython.<p>Later, port it to being web based using Pylons/Pyramid, Turbogears or whatever. Once you have a web based version, add login/logout, multi-user capability, user profiles, an activity stream, a REST API for external users, XMPP notifications, etc., etc., etc.<p>Then build an Android app version that uses the REST API.<p>Anyway, you get the picture. Just starting building and "jump in over your head" and force yourself to learn as you go. Go to the reference material, Google, Stack Overflow, mailing lists, whatever, if and when you get stuck, then build some more. Lather, rinse, repeat.<p>That's more or less how I've learned most of what I know about programming, other than a few times when I just decided "I want to learn X" and picked up a book on it and ran through the example code and read the book... but inevitable I get to a point where I need to actually take that and try to turn it into <i>something</i> tangible.<p>Like I said, this approach may or may not work for you, but maybe give it a shot and see how it goes.