A good programming resource is hard to find. Here, I highlight some of the best resources I’ve used, organized by topic.
Python Crash Course by Eric Matthes - If you’re new to programming and to Python, this book is a great place to start.
Matthes offers clear explanations of core programming concepts, like loops, functions, files, and classes. You’ll not only learn what a dictionary is and how to write one, for instance. But you’ll also get real-world examples of when to use it. Plus, many of his code examples offer line by line explanations. This will help you get better at reading (and understanding) code.
Ace Python Interviews by Reuven Lerner - This free course contains 50 instructional videos on Python topics organized into three levels: beginner, intermediate, and advanced. Each video focuses on a question that Lerner addresses in a screencast. You’ll learn how to swap variables, for example, but you’ll also learn why this works.
His explanations are supported by live code examples. You’ll see him write functions, classes, or conditionals to explain each concept. Lerner is an excellent teacher. So you’ll build your Python knowledge, while getting into the mindset of a great programmer.
Python Workout by Reuven Lerner - This book is another fantastic resource Lerner offers. It’s filled with 50 problems that dive into core parts of the Python language: strings, dictionaries, functions, files, lists and tuples, among others. This book is practice-heavy: after a brief introduction to a topic, Lerner gives you a problem to solve.
A point of distinction, however, is the thoughtful solution he provides. He not only provides the answer, but also a detailed explanation. As a result, you learn how to break down a problem, use the best tools to solve it, and understand each step of the way. In addition to the 50 core problems, Lerner provides extra problems (without solutions) at the end of each chapter for more practice.
The Execute Program offers a successful recipe for learning and retaining information. This course (and all of the courses offered through the Execute Program, including the SQL course listed below) offers an interactive teaching approach. Each lesson is focused and practice-heavy: you’ll work through problems throughout each lesson.
The courses are also review-heavy: you’ll complete problems on previously learned material before moving on to new material. It uses spaced repetition to track what you know and what you need to work on.
Sentance differentiates himself by his teaching approach: he diagrams everything. That said, you see what happens under the hood—line by line—when you call a function, for example. You see him add to the call stack and pop off of it. His approach is hugely beneficial for learning purposes: Sentance makes the abstract concrete.
SQL - Execute Program - Learn SQL with the Execute Program’s SQL course. This survey course covers many of the core topics of the SQL language, including: creating tables, using joins, handling conflicts, and using foreign and primary keys.
How to Solve It by George Pólya - This is a must-read for any programmer at any level. In it, mathematician George Pólya explains the problem-solving process. Although he writes through a mathematical perspective, the principles are timeless and easily applicable to programming.
There’s no way around it: to get better at problem-solving you’ve got to solve a lot of problems. Here are a few platforms and resources to try.
Exercises for Programmers by Brian Hogan - Hogan provides practical, real-world exercises that are organized by topic, such as files, data structures, and functions.
Exercism - This programming platform offers a variety of problems that range in difficulty. What I like best is its focus on tests: there is a file of tests for each problem. Solving problems on Exercism was my start with Test-Driven Development.
LeetCode - There’s no shortage of problems to solve on LeetCode. But it offers an important benefit: there are usually multiple solutions with detailed explanations for each problem you solve. As a result, you’ll get better at reading code, considering time and space complexity, and thinking about many ways to tackle the same problem.