As I have been working with Clojure more and more, I find myself taking the role of "Clojure Evangelist" with my friends and co-workers. If I am able to convince them to give Clojure a try, the very next question is always: "Where do I get started?". Unfortunately, for those coming from a Python/Ruby/Java type background, it's usually not enough for them to go try out a quick hello world tutorial. I think this is mainly because showing off the syntax will not sell anyone on the true power of Clojure and lisp in general. In fact if all you see is the syntax, you may be very turned off before you even get started.
So before I am too far away from absolute beginner, I am writing down a path (certainly not the only path) to learning Clojure. The 3 books I am recommending below are presented in the order that I believe they should be read. There are several other books out there, and I don't intend any slight to them or their authors. These 3 happen to be my favorite, especially when taken together.
Clojure Programming by Chas Emerick, Christophe Grand and Brian Carper has (IMHO) replaced the similarly named Programming Clojure by Stuart Halloway and Aaron Bedra, as the goto book for learning Clojure. They are both great books but Clojure Programming is a much more complete volume (covering topics such as Tools, DB Access, Web Development etc). In addition to giving a clear and thorough overview of Clojure as a language and platform, it also answers the questions that I have when coming to a new language/community such as:
- Where do I go for help?
- How should I layout my project?
- What are the idioms/patterns used within this community?
- What is the best build tool?
- What editor/IDE support is there available?
Clojure Programming will give you a solid foundation for programming in Clojure. The writing is clear and understandable with relevant examples. Reading through it becomes a page turner as each chapter builds your understanding on how things can be done in Clojure.
Functional Programming for the Object-Oriented Programmer by Brian Marick is not (strictly speaking) a Clojure book. It is a book about Functional Programming that uses Clojure as the language and targets programmers with an object oriented background. This is a book that teaches you more deeply the power that functional programming has to offer as you enter the world of Clojure. I have worked in functional languages for the last 2 years and reading this book still gave me several a-ha moments.
While I enjoyed this book a lot, some of the practices and syntax used in the book are aimed at teaching functional programming techniques and are not idiomatic Clojure code. For example when defining a function the book uses:
(def a-function (fn  (do-some-things)))
Where in Clojure we would more often use
(defn a-function  (do-some-things))
This is not a big deal at all, but since the subject of this post is learning Clojure it is something to note.
The Joy of Clojure by Michael Fogus and Chris Houser is my favorite technical book ever. However it did not start out this way. It was the first Clojure book I read and it very nearly turned me off to the whole language. To this day I am not sure why this is. After reading a few other books, and seeing people in the community rave about it as a second or third book, I gave it another try. The second time reading it, I read it straight through in a week and loved every page. The Joy of Clojure will teach you the why of Clojure. What makes Clojure so powerful and enjoyable to work with. Most importantly The Joy of Clojure will teach you how to think in Clojure. It is also worth noting that a second edition of this book is underway right now.
So there is my list. I would love to hear other opinions. There are countless useful materials out on the web that are worth using as well. http://clojure.org/getting_started has some good links and resources that can help get you started.
To anyone starting in Clojure, welcome! It's a fun, challenging experience learning Clojure. Have fun and remember that most things in Clojure are probably simpler than you are thinking. Happy coding!