Clojure is a very eclectic programming language,
based on concepts and supporting technology
from a wide range of sources, eg:
- Databases - atomicity, consistency, isolation, MVCC, transactions
- Functional Programming (FP) - comprehensions, lambdas, pure functions
- Java - data types, infrastructure, interfaces, object-orientation
- Lisp - homoiconicity, prefix notation, recursion, syntactic macros
- Perl - first-class maps and regular expressions, some syntax
Very few aspiring Clojurists will be familiar with all of these categories,
let alone all of the relevant concepts and how they interrelate.
For example, Lisp programmers may well have used FP techniques,
but are unlikely to be familiar with the Java ecosystem.
Rich Hickey has also added his own "special sauce",
finding ways to meld and/or supplement these concepts into a cohesive whole.
For example, consider the sequence abstraction
or his implementation of persistent, immutable data structures.
Assorted Clojurists have also been busy, porting and/or creating libraries
for logic programming, web development, and more.
Consequently, aspiring Clojurists have a large (and growing) body
of knowledge to discover, locate, select, comprehend, and use.
There is a wealth of Resources
(eg, books, videos, web sites),
so finding specific information tends to be easy.
The difficulty of comprehending and using the information will vary, of course,
depending on the person involved and the resources they are able to find.
However, none of this provides any focused help in detecting
key concepts that the Clojurist has never encountered (or noticed).
Telling the Clojurist to "read everything" isn't practical
and leaving discovery up to chance is unsatisfying.
So, we need an efficient way for aspiring Clojurists
to find out about unknown concepts,
assess their proficiency, and organize their studies.
My approach to this challenge is to create a taxonomy of concepts,
implemented as a (cross-linked) tree of web pages.
This structure provides the usual benefits of hierarchies:
modularity, organization, and rapid navigation.
It also allows rapid, straightforward navigation to a given topic page.
Each topic page (eg, Architecture
contains a collection of (brief) definitions,
organized by subtopic.
If a topic page would be too large for comfort,
it is broken up into an index page (eg, Data
and a collection of subtopic pages (eg, Data Collections
Much of this material is adapted from clojure.org
Most of the external links go to these (fine!) sites.
These pages can (and I hope, will) be used as a reference (eg, "annotated concept index").
However, they can also be used as a "check list", "reading list", etc.
Basically, dip into each topic and skim all of its entries.
If you find yourself saying "Heh?" (rather than "Uhuh"), you've found a problem.
Either make a note to get back to the topic later (slacker
or follow the embedded links and read up on it.
If you run into problems, please get in touch;
maybe we can improve the situation.
Finally, please feel free to suggest additions and corrections!