Elements of Clojure
Don't let the title fool you - 90% of the advice given in this book isn't specific to Clojure, and boy is it good advice.This book contains some of the deepest programming insights I've encountered, to be put on the same level as SICP or the Pragmatic Programmer.The discussions on naming and abstraction are particularly illuminating, exposing some fundamental tradeoffs like synthetic vs natural names, or principled vs adaptable systems of abstractions. Were these notions more widespread, a lot of the pointless rants and debates we hear in programming circles would disappear.I would not recommend this book to beginners - this book is most useful when you are experienced enough that your struggle is to make choices, not to get things to work.