Data and commentary on the results

The survey has been open since the 16th of January, but it hasn't closed, so the quantatative summaries below will reflect new responses as they trickle in. Most questions allowed more than one answer, so percentages will not add up to 100.

It may be interesting to compare some of these results with Chas Emerick's State of Clojure survey from last summer.

You can see the source for this survey on Github or get the raw results for your own analysis.

Total responses: 365

How long have you been using Clojure?

Just started
10 (2%)
23 (6%)
78 (21%)
1 year
74 (20%)
2 years
105 (28%)
3+ years
51 (13%)

Pretty even spread here. Plenty of old-timers.

For what do you use Leiningen? (pick as many as apply)

Open source
267 (73%)
Proprietary projects
212 (58%)
171 (46%)
Web sites
176 (48%)
73 (20%)
Backend code
144 (39%)
GUI clients
40 (10%)
Command-line applications
143 (39%)

Web apps are coming in strong here, with command-line applications making a surprisingly strong showing given this has long been a weakness of the JVM. The low showing of GUIs should probably be expected considering the tooling has only just started to emerge on that front. It's great to see open source so high.

Do you deploy jars?

to Clojars
124 (33%)
to other public repositories
22 (6%)
to private repositories
141 (38%)

Very surprising to see private repositories beating out Clojars, especially considering deployment to private repos was only added to Leiningen a year ago.

When did you start using Leiningen?

I don't remember
56 (15%)
0.5 (Nov 2009)
29 (7%)
1.0 (Dec 2009)
40 (10%)
1.1 (Feb 2010)
32 (8%)
1.2 (Jul 2010)
26 (7%)
1.3 (Aug 2010)
26 (7%)
1.4 (Dec 2010)
15 (4%)
1.5 (Mar 2011)
48 (13%)
1.6 (Jun 2011)
55 (15%)
13 (3%)

Nearly half of respondents started on the last two versions, which is interesting. Ten claim to be using the unreleased 2.0 snapshot, which I find difficult to believe. This would probably be more interesting done as a line graph over time, but I'm just now learning Incanter.

Your OS and package manager(s)

211 (57%)
Fedora/other RPM-based
23 (6%)
33 (9%)
17 (4%)
1 (0%)
Other GNU/Linux
9 (2%)
Mac OS X with Homebrew
110 (30%)
Mac OS X with Macports
48 (13%)
Mac OS X with Fink
4 (1%)
Mac OS X with no package manager
39 (10%)
Windows with Powershell
14 (3%)
Windows without Powershell
41 (11%)
Windows with Cygwin
25 (6%)
4 (1%)
6 (1%)
5 (1%)

I expected apt to have the lead here, but I didn't expect it to be such a dramatic lead. Windows is a bit higher than I expected, though the number on Windows alone is very small; most supplement it with a linux-based system. Homebrew is the clear leader among Mac users, but a surprising number somehow survive without a package manager at all.

How do you install Leiningen

Downloading bin/lein
266 (72%)
Package manager
49 (13%)
69 (18%)

The fact that Leiningen has only been packaged for apt since the fall makes this not terribly surprising. Most people using git are probably contributors.

Which Leiningen features do you use?

Auto-cleaning of transitively-compiled .class files
61 (16%)
Checkout dependencies
255 (69%)
clean task
162 (44%)
Editor integration
148 (40%)
interactive task
64 (17%)
javac task
69 (18%)
lein-clojars plugin
73 (20%)
Native dependencies
58 (15%)
pom task (other than for pushing to Clojars)
43 (11%)
repl task
234 (64%)
Shell wrappers
28 (7%)
Test selectors
65 (17%)
trampoline task
10 (2%)

Part of the challenge with this question is determining whether low usage of a feature is caused by low demand for it or just a lack of knowledge about it. For instance, it's easy to overlook shell wrappers, and very easy to miss out on the trampoline task. The javac task is used surprisingly often; apparently projects that carry legacy code with them are pretty common. I'm curious with the clean task whether people use it because they know they need it or if they just reach for it as a first instinct when things go wrong. I'd love to see more people using test selectors; those can be very handy to organize larger test suites.

Rank your biggest annoyances: (higher is worse)

  • Startup time | 26 | 31 | 33 | 54 | 70 | 88
  • Difficulty finding dependencies | 79 | 61 | 52 | 56 | 31 | 16
  • Not enough plugins | 106 | 76 | 62 | 34 | 10 | 1
  • Leiningen's own end-user docs | 76 | 73 | 62 | 50 | 29 | 4
  • Docs on extending Leiningen or writing plugins | 88 | 46 | 54 | 53 | 33 | 7
  • ClojureScript integration | 101 | 29 | 32 | 44 | 34 | 36

The chart's missing for this one on account of getting in a fight with Incanter's stacked bar chart and losing.

Startup time dominates here, as expected. Docs aren't too much of an issue, though docs for end users appear to be better than the docs for extending Leiningen itself. People seem to be pretty satisfied with plugin selection. ClojureScript is an issue, but the recent official release will help here, as well as progress on the lein-cljsbuild plugin. Finding dependencies is also tricky. Hopefully some of the data from ClojureSphere can be fed back into Clojars to help make this clearer.

Do you have custom tasks you haven't published as a plugin?

64 (17%)
266 (72%)

Of course, the relevant question here is how many of these internal plugins are really doing something unique to their projects. My suspicion is that it's not very many, and that most custom tasks could in fact be generalized and shared with the community.

Did you know if you have a single patch accepted you can ask for commit rights and a sticker?

51 (13%)
281 (76%)

Good thing this survey helped get the word out!

Other Comments Summarized

Lots of people want the features in Leiningen 2. Some are asking for stuff that's already been implemented in the master branch, so that makes me think we're on the right track.

I still think lein-multi should be rolled into core so people can be encouraged to test cross-version.

This is done; profiles in Leiningen 2 replace lein-multi in a much more flexible way.

I dislike having to rename README to each time after doing lein new.

The lein new task in 2.0 supports flexible templates for project skeletons, (the default emits and best of all it's usable from Leiningen 1 as well.

Please copy cake's approach to managing conflicts in clojure version dependencies. "lein deps" brings down two versions of clojure for a web app that I'm working on, while "cake deps" doesn't.

We're also splitting :dev-dependencies into two separate lists, :plugins that run in Leiningen's process and profile-scoped dependencies for dev-time dependencies that run inside the actual project. This will take care of de-duplication, which has always been a problem with plugins that aren't careful about their dependency lists.

I hope 2.0 will be backwards-compatible for end users of 1.6 (not plugin developers).

I've tried to avoid gratuitous breakage, but there are some things that are unavoidable. My hope is to offer a lein precate plugin (the opposite of deprecate, of course) that can suggest changes to your project.clj file to bring it in line with version 2.

I was not at all surprised to find startup time mentioned quite a few times. The upcoming 1.7.0 release uses tiered compilation to allow for quicker JVM startup on newer 64-bit JVMs; simple tasks can complete in around a second even without an SSD. Still not great, but a big improvement in some cases.

And then there were plenty of generally positive comments. A few of my favourites:

The only criticism is that lein clearly insulates me from all sorts of Java nastiness, and that's probably bad for my moral fibre.
I come from a maven background and resisted using leiningen for a while. I was an idiot.
Helped me convince my team to use Clojure over Scala.
Writing a plugin was easier and more enjoyable than I expected.
I wonder what my girlfriend would think of a red heart with a blue arrow and "Leiningen forever!" underneath?

It's always encouraging to hear things like that, so thanks!

Leiningen is great, it just needs more documentation love and more refinements for complex/multi-module builds, startup time, Java-compilation (and JVM langs compilation via plugins) and so on.

Definitely interested in getting feedback from folks with complicated builds. I think lein-sub has potential to help make larger projects more manageable by allowing you to break them down into multiple smaller projects, but larger projects often have unique requirements. And of course, plugins that target other JVM languages are only going to happen if users of those languages step up.

Having used build scripts, make, rake, sbt and leiningen, I'd say leiningen ranks far above the non-make crowd. (sorry. Make rules.)

Apparently there are people who like make! I did not know this.

One (very) minor annoyance with the docs was figuring out checkout dependencies. It wasn't clear at first whether I needed to change project.clj for either the main project or the checkout, and whether the checkout would take precedence over libs from remote repos.

I've noticed again and again that checkout dependencies confuse a lot of people, but I have yet to figure out why or how they could be explained more clearly.

One area that I am interested in is managing and packaging generic and non generic clojure code - for jvm/cljs/clr effectively.

This is definitely an open question, and I think to an extent time will tell how this will shake out. At some point we'll probably have whole libraries that can run on the various runtimes, and having subsets of a project that can run in Javascript or the JVM is actually already possible with the lein-cljsbuild plugin. But only experience will tell us what works here.