Programming via practice is actually a very inefficient way of learning to program. It's sort of like a professional basketball player learning by playing matches. It wears people out fast and teaches them very little they don't know.<p>To truly improve, they have to train properly. A basketball player trains their dribbles, running, shots, peripheral vision. A programmer has a lot of other small things to train - algorithm, optimization, passing around bits of code from one class to another, or disciplining themselves to stay in flow.<p>My training routine breaks things down into 4 levels:<p>1. Understanding the concept. Also includes knowing how to google certain types of code, knowing what to look for, what to copy.<p>2. Being able to build it without any hints.<p>3. Feeling/instinct. You no longer have to think. Not only that, but you can immediately 'feel' a mistake or error, and where.<p>4. Potency. You do it faster and smaller. There's no end to it.<p>The people who are deep in level 4 are invisible to those at level 2 or less. Sometimes it seems like magic, sometimes it seems like incompetence or stubbornness.<p>Creativity only happens when you have many parts at level 3 and above. You have to internalize/feel the parts, before you can code very effectively. Then when you have a problem you're trying to solve, your brain just sorts it out in the shower.<p>But with programming, once you code something once, it becomes a function. Many people don't solve the same problem twice. It gets copied and pasted. And thanks to Stack Overflow, it's possible to go 20 years of experience without ever reaching level 1 skill.<p>This is not necessarily a bad thing. This means you can ignore parts like memory management or effective sort algorithms and focus on the important things. It's up to you to figure out which skills are really core to your ambition and focus on that.