My recent experience with daily freecoding taught me a lot about learning programming and about how you learn new skills.
There were several types of freecoding sessions that I did and each of them proved useful for different reasons.
I had a handful of memorized programs one of which was to program a deck of cards, shuffle the deck and print them all out. I memorized this and practised several times recalling the whole program and typing it as fast as I could. Getting fast at this reinforces basic syntax, it improves your muscle memory for typing and helps add to a repertoire of coding patterns that can be recalled quickly. Since the bulk of programming day to day is loops, string manipulation and parsing, this type of practice can greatly improve your productivity. However, it doesn’t help with your ability to solve problems.
Other days I would seek out a problem. Rosetta Code is a good resource for coding problems that can usually be solved in just a few lines of code. I’d find something that sounded interesting, implement my solution and then compare to the published one. This process helps with your ability to produce code that can do what it needs to do, but also by then reading other people’s solution you often learn about nicer or more concise ways to implement it.
The final type of freecoding I did was to find an interesting library or package I wanted to try out, and implement some examples with it. From a learning to code perspective this doesn’t help a lot. Much time is spent going though documentation and the temptation to copy and paste is high. It did, however, let me explore a lot of variety and learn about some specialized things – such as what you can do with special non-printable terminal characters)
Some ideas I have to make the experience better going forward would be to add a scheduling component. We remember things better if we try to recall them just before we forget them. This is the concept used in Spaced Repetition Systems (SRS). Applying this to a learning system for coding might include a development phase where you create a new piece of code that introduces new concepts and then a handful of recall sessions where you try to re-implement one of those previously created programs at a later date.