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.

Software

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.