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.<p>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.<p>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.<p>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.