
One of the best ways to learn a programming language is to use it to solve problems. That's what this book is all about. Instead of questions rooted in theory, this book presents problems you'll encounter in everyday software development. Get sharp and stay sharp with more than fifty practice exercises rooted in real-world scenarios.
Start with Make It Stick (Brown et al.). Apply what this book teaches you to every one afterwards.
Next, read and work through Exercises for Programmers (Hogan) and A Common Sense Guide to Data Structures and Algorithms (Wengrow).
After you finish those two, read The Missing README (Riccomini et al.) and Extreme Programming Explained (Beck et al.). These two books provide very different viewpoints into the stuff that isn’t coding in a programming job.
Assuming you’re using an OO language, follow that up with Object-Oriented Analysis and Design with Applications (Booch et al.) and Object Thinking. They contrast each other quite a bit; having both perspectives is handy.
Once you’re through all those, I recommend Tidy First (Beck), Implementation Patterns (Beck), and Test-Driven Development By Example (Beck). These three books of his provide an incredibly accessible view into better ways to code.
If you’re anything like me you get bored reading one book for too long. I’ve found that having a second book going that I can switch to is great for that. A parallel track with The Pattern On the Stone (Hillis), The Pragmatic Programmer (Thomas & Hunt), The Mythical Man-Month (Brooks), and How Computers Really Work (Justice) provides a reprieve and some technical and cultural context.
It’s just an ordered collection of exercises that starts easy and builds up to more challenging ones. I can’t overstate the power of this simple book.
I agree TDD is a good way to learn a new language.
One of my favorite books Exercises for Programmers (https://www.programmingbooks.dev/extra/#exercises-for-progra...) promotes this approach as well.
Talk to other people who build “big systems”, whatever you decide that definition means. Ask them lots of questions. (Not the “Emacs or Vim?” kind. Instead: “When you wrote x, where did you start? How did you arrive at the solution you found? What would you change if you started again today?”)
Build systems, big and small, on your own and with others.
If you're not sure what to build, I like “Exercises for Programmers” by Brian Hogan:
https://pragprog.com/book/bhwb/exercises-for-programmers
The problems are still pretty trivial but a little larger in scope than most from https://exercism.io.
Beyond that, I try to find videos or tutorials of people solving real-world problems. For example:
Go: https://gophercises.com/, https://gowebexamples.com/, https://www.usegolang.com/, https://lets-go.alexedwards.net/, https://testwithgo.com/
C/C++: https://handmadehero.org/
Haskell: https://typeclasses.com/
Mixed: https://howistart.org/
Pair programming and live coding videos on YouTube can be worthwhile too.
“Hacking with Andrew and Brad” is an example for Go: https://www.youtube.com/watch?v=yG-UaBJXZ80
“Pair Programming with Jon Skeet” is another example: https://www.youtube.com/watch?v=zvz2omT9fzk
You get to hear people talking through their thought process and learn how other people solve problems and structure solutions.
The Twitch Science and Technology section is another place to find similar stuff:
https://www.twitch.tv/directory/game/Programming
I like Tsoding for functional programming:
And SerpentAI for Python/AI:
https://www.twitch.tv/serpent_ai
Watching people code can be dull or exciting depending on your mindset. I try to dip into these channels occasionally and soak up ideas from them, then go away and make things. I don't generally learn much without writing code too, and look for technical books and courses with exercises and problems.
We need more of this, though. I wish there was a programming puzzle site full of problem statements of the type, “build an application that does x”, where solutions are ranked by the community and sorted by language. It would be such a helpful resource.