Programming Resources List
Here is a collection of books and other resources I’ve found helpful throughout my undergraduate and software engineering career. I plan on maintaining this list as I grow and move through various roles.
Do not go through every resource end-to-end. I try to note why I like each resource and highlight standout parts, but ultimately the resources you might pick up and the order in which you go through them is flexible. This is not a prescription, rather it’s a “choose your own adventure”.
I hope you find something useful here.
Last updated 2023-04-06
Designing Data-Intensive Applications by Martin Kleppman
Few books manage to strike a good balance between plain English and technical depth. Kleppman does a wonderful job, and curates a list of papers, blog posts, and other books that dive deeper into every topic discussed. If you want to understand distributed systems, this book is a great place to start.
Operating Systems: Three Easy Pieces by Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau
Another book on the the teachyourselfcs.com list.
I was able to pick up this book with zero prior experience in operating systems and some light experience in C (<1k lines of code written). I only read and worked through the parts of the book that was relevant to me (process management, memory management), but will definitely return when I need an introduction to persistence and security.
My favorite part is that the book comes with a list of assignments with solutions (some programming, some theory). When introducing yourself to a topic, I find exercises and projects the fastest way to ramp up understanding.
Crafting Interpreters by Robert Nystrom
A profound moment in any engineer/computer scientist’s career is when something that previously seemed like magic becomes mundane and banal. For a long time, programming languages and how it gets translated into assembly was magic I could never quite wrap my head around. That is, until I started reading this book (and a handful of relevant chapters from Intro to Theory of Computation by Sipser).
I hope you get as much joy working through this book as I do.
UPDATE 2022-12-04: When I initially wrote this comment I hadn’t gone through the entire book and just started the second half. After finishing it, I can truly say what Nystrom has done here is amazing. I find myself much less confused when reading about other technologies, and find that the ideas discussed in the second half of the book pop up in a lot of places. This book is in my top 2 in terms of ROI from concepts learned, right next to DDIA
From Python to Numpy by Nicolas P. Rougier
Python is used in far too many places to ignore it. I find myself using very often, both in professional and personal projects, and have finally decided to bite the bullet and take steps to reach higher proficiency with the language and its ecosystem.
numpy is the backbone of many data science and machine learning projects.
It helps make Python fast.
But as Rougier dives into throughout this short book, it takes some knowledge of
numpy’s model of an array and a lot of experience in formulating problems to take advantage of
I’m happy to have stumbled across this resource on my search for making Python more performant.
It’s filled with pragmatic code examples and reference material.
But the part of the book I enjoyed most is its discussion of general approaches to solving problems and vectorizing code.
I imagine these ideas will carry me far beyond the
numpy and Python ecosystem.
- Preventing the Collapse of Civilization by Jonathan Blow
- An interesting discussion on software’s growth and increase in software complexity.
- The Future of Programming by Bret Victor
- A brief peek into the early evolution of programming languages and paths not taken.
- Containers From Scratch by Liz Rice
- Showcases some interesting Linux features that have enabled containerized software (which gets used in many modern software stacks).
- So you want to be a Python expert? by James Powell
- A demo of “programming metaphors” that fundamentally changed the way I looked at Python programs.