Here’s a list of books, articles, talks and other things that have changed the way I think in some way. Hopefully you’ll find something that will inspire you.
Please let me know if you’d like to chat about any of these, or have any suggestions for things I might enjoy!
Software Engineering
- Robert L. Read - How to be a Programmer free book — A useful set of “how to” guides for programmers of all skill levels, with particularly great insights into the “soft” skills. I come back to this every couple of years, and always feel like I understand more.
- Julia Evans - Wizard Zines zines — Playful but extremely information-heavy zines about essential technology (Linux, Bash, CSS, SQL, Docker, …) you’ll definitely come across as a software engineer.
Software Design
- John Ousterhout - A Philosophy of Software Design book — Probably the most useful book on how to structure software I’ve ever read. Contains great insights into what good software design is, and shows you a bunch of red flags that you can use to tell when these insights are violated.
- Daniel Jackson - Rethinking Software Design talk — Introduces the idea of concepts, purposes, principles and misfits as fundamental elements of software design, and how to use these to identify “bad smells” in software designs. By far one of the most useful frameworks for analyzing bad software, and how to fix it.
- Richard Gabriel - Worse is Better article — Old-school classic about the superiority of “worse-is-better” design over the “the right thing” (aka. the “MIT approach”).
Distributed Systems
- Martin Kleppmann - Designing Data-Intensive Applications book — The bible for everything related to practical distributed systems and databases. Tons of knowledge packed in very densely – very useful as a reference guide, for example when trying to choose between different databases, or trying to do anything over the network. I feel like I make the mistake of reading the relevant chapter in this book after I’ve made a fundamental mistake far too often in my life.
- Jay Kreps - The Log: What every software engineer should know about real-time data’s unifying abstraction blog post — In-depth insight into the approach of using a centralized append-only log as a practical way of solving some of the hardest distributed systems problems in an “enterprise” setting.
Pillars of Programming
- Douglas Engelbart - The Mother of all Demos (1968) talk — Proof that we have been reinventing the wheels since the 60s, just with better hardware. The demo which introduced windows, hypertext, graphics, efficient navigation and command input, video conferencing, the computer mouse, word processing, dynamic file linking, revision control, and a collaborative real-time editor. Read Bret Victor’s words on Doug Engelbart to understand how this shopping list understates the real impact of this work.
- Alan Kay - The computer revolution hasn’t happened yet (OOPSLA 1997) talk — All-time classic talk about the big picture ideas behind object-oriented programming: its roots in molecular biology (objects as cells), constructing vs growing software, “objects can act like anything” (objects as computers), and many more. Also features some classic zingers aimed at mainstream OOP languages like C++ & Java which we’re unfortunately still stuck with, almost 25 years later.
- Guy Steele - Growing a Language (OOPSLA 1998) talk — I won’t spoil the premise of the talk, but I guarantee you that you will have new-found appreciation for the art of programming language design after watching it.
- Alan Perlis - Epigrams in Programming (1982) list — Pithy quotes from one of the originators, ready to be whipped out any time you want to sound smart and mysterious.