The Caves of Clojure
stevelosh.com
stevelosh.com
This has not been my impression.
There is a lot of missing documentation -- and by that I mean high-quality, contextual, human-readable, practical documentation -- though the community has been working to remedy that.
There is a particular definition of "culture of brokenness" that I'd agree with but there are a lot more that I wouldn't. I'd have to hear the author's definition of what he means by that before I agree.
That being said Clojure is downright beautiful. I wish I had opportunity to work with it more.
Thank goodness for syntax-coloring editors or it would take me hours to track some of these things down.
I can but agree with this, Clojure rivals template-heavy C++ in GCC for the uselessness and pointlessness of the humongous heaps of cryptic error messages it produces.
This may actually be a bad thing, because it disincentivizes those who have the ability to fix things to be more newbie-friendly.
The problem is that these require a running, working system to format and print the stacktrace (as well as inspecting the state of the Clojure runtime). Unfortunately, uncaught exceptions will also quite often FUBAR the REPL, if not the entire JVM, meaning that improved stacktrace tools can only work some of the time, and will sometimes even make things much worse (if the JVM throws an exception from within the stacktrace formatter itself.)
Lack of documentation: Yes, some documentation that's a bit more approachable for beginners would be nice.
Warty JVM interop: No, given how unpleasant interop can be, Clojure makes it about as easy as humanly possible.
When I started learning Django, the key thing which everyone pointed me to was a simple screencasted tutorial where a man with an Indian accent started showing me how to write a wiki in Django. It wasn't pretty but it was a way to bootstrap myself enough into the Django mindset that I could start learning how to do database-driven web design. Then I could sit down and read the docs and they mostly made sense. Before that, Django was impenetrable; just seeing "oh there's a data model which is embodied within the databases, you have to run 'syncdb' first to get this working," etc. was a harrowing way to do 'Hello, World!'.
I have a little advantage with Clojure because it is a Lisp and I've done Lisps before when I followed the SICP video lectures and learned some basic Scheme. In this respect coming to Clojure is much easier for me than working with Haskell. (Although seriously, the Haskell interpreter is so much easier to use--please, someone implement libedit or another readline clone in Clojure and put it in the Clojure main distribution so that the 'up' key gives me the last line.)
But nonetheless, this is the first time I've seen a clear attempt to say, "here, let's work together to build a substantial program in Clojure." There is so much you can learn from such approaches that I think it's crucial to have some. Even this first tutorial page starts talking about how you should do some 'lein trampoline run' call rather than trying to do things with Clojure directly: that's something crucial which was never communicated to me via the Clojure web site. I now get to read up on Leiningen and what the hell that is for, as well as perhaps what the hell is in clojure.contrib that they also don't tell you about on the clojure.org "Getting Started" pages.
Seriously. This sort of thing is the difference between `django-admin.py startproject website` and creating a new text file which starts `import django`. Both are technically ways to develop a new site with Django, but the first one is the Correct Way To Do Things. (And fortunately djangoproject.com tells you to do things this way.)
You just pick up so much implicit stuff when you follow someone along as they program a very simple nontrivial application.
Lots of the discomfort in Clojure is a function of what also makes Clojure really great: fast moving, willing to break compatibility to keep making it better.
Eventually the language and platform will become more stable. I am not sure, but we may be at that point now, or very soon.
I must admit I lost a little bit of time this morning creating a new Noir project because of lein1 vs. lein2 issues. I am also trying to decide whether or not to go back to my really old projects and update to Clojure 1.4, refactoring of Clojure contrib, etc.
This works fine for me using Leiningen 2. All the usual libreadline functionality is there, and there's tab-autocompletion too.
I think this is something that needs to be better communicated and understood. When you pick up a new language, you also pick up its tools, and the landing pages for languages need to better communicate which build-tool is "blessed".