I think this is an alright post for self-learning programming to start, but one thing I haven’t seen much of is how to improve as a programmer once one hits intermediate levels. I’ve been reading a lot about performance improvement lately, and most of the literature uses K. Anders Ericsson’s research as the starting point (his book released this year, Peak, condenses his 30+ years of research in his own words, and it’s the single resource I would recommend the most to anyone else interested in the subject).
To summarize briefly as best as I can:
Improving at performing a task comes from developing better mental models through deliberate or purposeful practice.
Practice and performance are different, and the best way to practice is almost never performance. For example: a baseball player who wants to improve his hitting spends 30 minutes taking 200 pitches at the batting cages (practice), not 2 hours seeing 15 pitches in a game (performance).
To be able to achieve improvement, one must be able to define what constitutes improved performance and break down the steps to achieving that.
I’ve found that most of the ways people recommend improving at programming are just performance-based. This blog post, for example, has some good recommendations, but it comes down to spending a lot of time coding. Read code, read about code, write code, do projects, talk about code, etc… A programmer will certainly improve if they do these things outside of their own work, but it doesn’t seem very efficient.
What if I want to get better at programming, but only want to spend a couple hours per week of my own time doing it? What’s the most efficient way to build better mental models so that I make better decisions? One of the go-to examples in Peak is musicians. There are defined, regimented ways to improve at a particular instrument that can be broken down into chunks so small that one can learn a new piece of music over the course of a month or two with just 5 minutes of daily deliberate practice. With programming, we don’t have the luxury of that kind of well-defined goal or measures of improvement (ie: number of mistakes on a certain section), but I also haven’t found anything that’s even relatively close.
So how do we get a feedback loop on our own performance as programmers? We get a feedback loop on a particular piece of code, whether it works or not, how performance and robust it is, etc. But we don’t often get real-time feedback of our approach to a problem.
The closest thing I’ve found to a feedback loop for self-study is the problems over at Advent of Code. The programming problems simulate real-life ones pretty well (requirements are well-defined, but edge cases are not written into the spec and must be implied), and there is immediate feedback on how well-designed your solution was, because there’s a part 2 to every problem that throws in extra requirements or some other wrinkle, meaning you have to reevaluate how well-designed your original solution was.
This went a little longer and more rambling than I expected, but I’d love to hear if anyone here has thoughts on how to improve as a programmer?
The closest thing I’ve found to a feedback loop for self-study is the problems over at Advent of Code.
Have you tried exercism.io? I’ve found it quite close to what you are describing, especially the feedback loop part.