There’s a functional programming theme running through this list. (Even C++ templates are a purely functional environment. A deeply weird one, but if you want to do much template meta-programming it definitely helps to immerse yourself in functional programming.)

I don’t think it’s an accident that the books I remember as most mind-expanding are disproportionately about functional programming. Functional programming ideas are powerful, and fundamental to computer science.

It feels, these days, like we’re slowly but steadily incorporating elements of the functional programming toolkit into “mainstream” languages.

This kind of evolution has happened before. When I was in graduate school, a lot of my friends and I wrote Lisp and Smalltalk code in our academic lives, and C and C++ code when we moonlighted in “industry.” It’s fair to say that people outside academia were often pretty skeptical about languages with garbage collection and first class functions. Fast forward to today, and a huge amount of production code (maybe most production code) is written in languages that have both features (JavaScript, Python, Ruby). Computers got faster, implementations improved, and a new generation of programmers grew up and made new decisions about tools and approaches.

JavaScript is a perfectly reasonable functionally oriented language, if you choose to use it that way. Ruby has #map, and #each, and #select. Swift has pattern matching. These features are the low hanging fruit of functional programming. They are very useful, but are also easy compromises that still fit into an imperative language design.

It’s going to be interesting to see whether additional aspects of functional programming start to see widespread use over the next few years. Purely functional data structures — sometimes called “immutable data structures” — are one candidate for mainstream adoption. If you’re coming from an imperative programming background, there’s a learning curve to using purely functional data structures. And performance will sometimes be an issue. But if you use only immutable data structures, some classes of bugs go away, particularly bugs relating to multi-threaded code. In our increasingly multi-core and distributed world, that’s a big deal.

Chris Okasaki’s Purely Functional Data Structures is the standard reference and tutorial on immutable data structures. It’s a joy to read. I agree with jao: the signal to noise ratio in this book is very, very high. This stackexchange thread on what’s new since the book was published is also worth a read.