I have been writing code for 25 years.
Along the way, I have done all sorts of things to try to get better:
- Read a ton of O'Reilly and Pragmatic Programer books
- Watched a bunch of screencasts
- Contributed to open source
And all of these things helped me a ton.
But if I had to start all over again (as a beginner), this is the simple framework I wish I had for learning a new programming language:
Step 1: Find a problem or domain you already know
You don't want to mix trying to learn a new language with trying to learn a new problem or domain. So either pick a problem you've recently solved in your current language or a domain that you know well (e.g. to-do app, tic-tac-toe, Conway's Game of Life)
Step 2: Implement a solution with the new language
Do your best to implement a solution to the problem with the new language or framework. And don't get hung up on the "right" or "idiomatic" way to do it, just make it work. It's going to feel like you're fighting against the language, but just keep going.
Step 3: Write step by step instructions for your former self
Imagine you had a list of step by step instructions explaining how you solved the problem in the new language and why you chose to do it that way. Would have been pretty helpful, right?
Now go write that list of instructions detailing each step you took along the way and most importantly WHY you did it that way. You'll start to understand what else you need to learn about the new language.
And when you're starting out, that's all that matters.