Last updated on 2023-03-20 20:38

Useful resources

This page contains a number of essays and books I found particularly instructive, and software packages I frequently use. The resource list below is obviously not exhaustive.

Readings in programming

Various materials available online:

  • Peter Norvig's classic Teach Yourself Programming in Ten Years, here.

  • MIT's The Missing Semester of Your CS Education, here.

  • Ben Kuhn's Essays on programming I think about a lot, here. Equally interesting are the many blogs people reference in the comments.

  • Robert L. Read's How to be a Programmer, here. I like the long treatment of various soft skills, particularly in the "Intermediate" and "Advanced" sections of the book.

  • I like the 'code review pyramid'.

Physical books:

  • GoF's Design Patterns. This is best read once or twice, and then kept as a reference book.

  • Martin Fowler's Refactoring. Combined with GoF, this is a great resource on how to do OOP right, and improve the structure of existing code.

  • Kent Beck's Test-Driven Development. This book is short, to the point, and really hammers down the concepts of TDD. I often sin against the TDD premise of "test first, code later", but do agree that (almost all) code should - and can - be supported by meaningful tests or validation tools.

  • Andrew Hunt and David Thomas' The Pragmatic Programmer. This book is a classic, touching upon many aspects of software development. I like this book so much, it has not been on my book shelf for years: I keep lending it to friends and colleagues to read.


Most of my personal projects are in Python because that language covers almost all of my needs, is extremely flexible, and I find its code structure visually pleasing (I am the first to concede all these points are extremely subjective). When performance is critical for a particular application, I often switch to C or C++, sometimes with Python bindings.

Most of my projects use numbers in some way, so in Python I often work with numpy, pandas and the like. In C++ I use Armadillo (arma) as a numpy-equivalent.

Interfacing C++ and Python is achieved by the excellent pybind11 project. I sometimes complement pybind11 with carma for the conversion between numpy and arma types.

My mathematical programming problems are mostly solved with Gurobi, but I have also used IBM's CPLEX and Google's OR-Tools in the past. For an open-source project, OR-Tools works really well and I intend to use it more often in the future.