Data and commentary on the results

The survey ran from the 24th of March to the end of April. Most questions allowed more than one answer, so percentages will not add up to 100.

Last year's survey results are still up.

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: 400

How long have you been using Clojure?

15 (3%)
62 (15%)
1 year
76 (19%)
2 years
97 (24%)
3+ years
146 (36%)

Oddly enough, the number of 3+ answers this year was almost exactly the same as last year. However, all the other numbers have fallen, especially the 1 year bracket.

When did you start using Leiningen?

I don't remember
23 (5%)
0.x (Nov 2009)
26 (6%)
1.x (Dec 2009 - Mar 2012)
200 (50%)
2.0.0-preview (Mar 2012 - Jan 2013)
46 (11%)
2.x (Jan 2013 - present)
103 (25%)

What operating systems do you use Leiningen on?

321 (80%)
Mac OS X
262 (65%)
76 (19%)
Cygwin or other Windows GNU
23 (5%)
1 (0%)
14 (3%)
0 (0%)

There is still a Solaris user.

What package managers do you use?

273 (68%)
63 (15%)
8 (2%)
15 (3%)
44 (11%)
BSD ports
13 (3%)
224 (56%)
21 (5%)
6 (1%)

Homebrew's share here has actually grown a bit (mostly at the expense of macports), and pacman has shown a slight bump, but apt-get continues its well-deserved dominance.

How do you install Leiningen?

Downloading bin/lein
327 (81%)
Package manager
99 (24%)
Through IDE integration
6 (1%)
Windows installer
12 (3%)
From git
34 (8%)

The number of people using their package manager has risen, which is a good sign that typically-lagging packagers are catching up to Leiningen. Unfortunately the version of Leiningen in apt-get is too old to be usable, which is undoubtedly a big part of why the bin/lein share is so big. The newer Windows installer and IDE integration choices remain relatively obscure.

What JVM versions you use regularly? (java -version)

136 (34%)
362 (90%)
95 (23%)
prereleases from source
5 (1%)

No surprise that Java 7 dominates here. Java 6 continues to hang on to life longer than one might expect. Version 8 was released a week before the survey opened but is already used by nearly a quarter of respondees.

Which Leiningen features do you use?

custom profiles
242 (60%)
132 (33%)
checkout dependencies
194 (48%)
editor/IDE integration
165 (41%)
native dependencies
84 (21%)
auto-cleaning of transitively-compiled .class files
54 (13%)
pom task
75 (18%)
CLI repl
271 (67%)
14 (3%)
test selectors
91 (22%)
trampoline task
131 (32%)

We've got a lot more people using aliases, which is great. It's not obvious to many that you can use them for partial application of tasks, which lets you express things in a very tidy way. Grenchman hasn't caught on widely, probably because it's a bit difficult to explain and hasn't been promoted much. Use of custom profiles has risen significantly too, which seems to indicate better understanding of more advanced Leiningen features.

Do you use Leiningen for any mixed-language projects?

Only Clojure
219 (54%)
Clojure with Clojurescript
215 (53%)
Only Clojurescript
56 (14%)
Clojure with Java
161 (40%)
Clojure with another JVM language
13 (3%)
Plain Java
13 (3%)
Another JVM language alone
0 (0%)

It's now nearly as common to use Leiningen for Clojure+Clojurescript projects as it is to use it for Clojure alone. Pure Clojurescript projects have also doubled to 14% from last year. Other numbers seem mostly unchanged; there are still a ton of Clojure projects that contain Java source.

What annoys you about Leiningen?

startup time
219 (54%)
difficulty finding dependencies
24 (6%)
lack of plugins
6 (1%)
confusing profile logic
61 (15%)
support for native code
16 (4%)
AOT issues
65 (16%)
unmanaged jars
60 (15%)
leiningen's own end-user docs
31 (7%)
docs on extending Leiningen or writing plugins
49 (12%)
other (please provide details in comment box below)
25 (6%)

Obviously startup time continues to dominate here. If you're one of the many who indicated this was a problem but you haven't taken a look at Grenchman yet, now would be a great time to do so; Grenchman allows you to keep a running JVM "hot" and simply connect to it from a fast-launching CLI program. Complaints about documentation are down, which is always encouraging to see, and nearly no one has a hard time finding plugins for their needs.

Two new options this year were 3rd and 4th place: "confusing profile logic" and "AOT issues". I feel that AOT problems can mostly be addressed by profile isolation; see the end of the FAQ for details. Unfortunately it's technically a breaking change, so we can't enable it by default until 3.0, but turning it on for your own projects will help you avoid most of the problems around AOT. Confusing profile logic is trickier; from what I can tell the problems are a mix of counter-intuitive behaviour around how profiles interact with direct project map manipulations (update-in etc.) and plugins that use middleware in unpredictable ways. If you're a plugin author, please think hard before using middleware; there's almost always a better solution for whatever you're trying to do.

Do you have a GPG key?

Yes, and I've gotten it signed by others
33 (8%)
Yes, and I have used it
138 (34%)
I have one, but I've never used it
68 (17%)
I've been meaning to get one
52 (13%)
106 (26%)

Pretty strong growth here in active usage; this is up from 25% to 34%, which is great.

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

106 (26%)
286 (71%)

I love sending people stickers.

Other Comments Summarized

Not a whole lot of suggestions were submitted. I feel like that might be a sign that Leiningen has matured a fair bit recently. There's not much missing for most people.

There were a few comments about how it's more cumbersome than it could be to publish and consume private dependencies. We've added documentation for how to deploy over scp in the latest release, so hopefully that simplifies things for users who already have servers set up. The existing infrastrucutre around SSH key pairs is much better than what we have for S3 buckets.

I miss some functionality to have a task auto run if one of it's source files are changed.

For a while, we had a number of plugins that rolled their own support for this, which was really unfortunate. But these days there's a plugin that provides a higher-order task for this so the auto-re-run functionality is decoupled from a specific task, which is great. We might consider including this in a future version of Leiningen to increase its visibility.

Plugin and template authors are writing code that hijacks (or makes assumptions) about the operating context, yielding unstable and unpredictable results. The simple answer is "don't use plugins," except that's one of the major use-cases for leiningen to begin with.o

Leiningen allows plugins to declare hooks and middleware (which you can disable) that can run arbitrary code even when their own plugin task isn't being invoked. Since the effects of these hooks are not transparent or obvious, they're intended as a measure of last resort to allow for workarounds in situations where the built-in extension mechanisms aren't cutting it, but it appears that some plugins are taking it beyond that, which is unfortunate.

Dependencies that include native code continue to be a weakness since no one on the Leiningen team actually uses them. Unless someone familiar with native libraries on the JVM steps up to help, this will likely continue.

I think lein-exec is so useful, that it would nice to have it folded in to the 'core' functionality.

This is basically already included as part of the run task. lein run -m clojure.main -i /path/to/file.clj will load it. Since aliases can be partially applied, you can shorten this too: :aliases {"exec" ["run" "-m" "clojure.main" "-i"]}

Leiningen has been the single most important tool for increasing Clojure adoption.

Overall the feedback has been very positive, so thanks for being great users.

See all free-form comments.