Introduction
Programming usually involves problem-solving using basic building blocks. As such, an effective programmer should be fluent with the basics and know how to combine them to solve more complex problems.
To gain proficiency and to develop problem-solving skills, there's no better way than practicing. I believe the most effective way to practice is to work in a real project, ideally under a mentor who can tell good code from bad code, and who can show how they solve problems.
However, sometimes working on a real project is not possible e.g., not being hired due to the lack of experience, or the high barrier to entry with complex open-source projects. The next best approach is to solve increasingly complex challenges from books and tutorials. This definitely helps with learning the basics, building problem-solving skills up to a level, and gaining confidence as a programmer.
I have been trying to pick up the Rust programming language. This book documents my attempt at gaining Rust proficiency by following the challenges in Exercises for Programmers.12
1 Although many people suggests books such as Programming Rust after The Book, I find doing challenges less boring.
2 As you can see here, this is also me practicing writing in English.