Skip to content

Instantly share code, notes, and snippets.

@wildermuthn
Last active January 19, 2021 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wildermuthn/c783ed4f6735fa66c4e7ad34830b3977 to your computer and use it in GitHub Desktop.
Save wildermuthn/c783ed4f6735fa66c4e7ad34830b3977 to your computer and use it in GitHub Desktop.
My Clojure Port-Mortem

This title is tongue-in-cheek, in that Clojure is obviously not dead, and among some sectors it is thriving. Yet overall, few people or companies I've introduced to Clojure are still using it, and although I spent 3 years using Clojure full-time, I haven't written a line of it in the last few years. And in the 2020 State of Clojure reports that use is shifting from small companies toward larger corporations. What we clearly see is that for all its core power and elegance, Clojure has not built up a correspondingly powerful ecosystem. Why?

After my most recent internal debate about "Why the hell am I not using Clojure again?", I had a clarification of thought: Clojure is not, as it describes itself, practical.

To explain why, I want to share two quotes that provide a sharp contrast: Rich Hickey's "Open Source is Not About You", and Russ Cox's keynote from GopherCon 2015

Russ Cox:

A language needs large, broad communities.

A language needs lots of people writing lots of software, so that when you need a particular tool or library, there’s a good chance it has already been written, by someone who knows the topic better than you, and who spent more time than you have to make it great.

A language needs lots of people reporting bugs, so that problems are identified and fixed quickly. Because of the much larger user base, the Go compilers are much more robust and spec-compliant than the Plan 9 C compilers they’re loosely based on ever were.

A language needs lots of people using it for lots of different purposes, so that the language doesn’t overfit to one use case and end up useless when the technology landscape changes.

A language needs lots of people who want to learn it, so that there is a market for people to write books or teach courses, or run conferences like this one.

None of this could have happened if Go had stayed within Google. Go would have suffocated inside Google, or inside any single company or closed environment.

Fundamentally, Go must be open, and Go needs you. Go can’t succeed without all of you, without all the people using Go for all different kinds of projects all over the world.

Rich Hickey:

The only people entitled to say how open source 'ought' to work are people who run projects, and the scope of their entitlement extends only to their own projects.

Just because someone open sources something does not imply they owe the world a change in their status, focus and effort, e.g. from inventor to community manager.

As a user of something open source you are not thereby entitled to anything at all. You are not entitled to contribute. You are not entitled to features. You are not entitled to the attention of others. You are not entitled to having value attached to your complaints. You are not entitled to this explanation.

If you have expectations (of others) that aren't being met, those expectations are your own responsibility. You are responsible for your own needs. If you want things, make them.

Open source is a licensing and delivery mechanism, period. It means you get the source for software and the right to use and modify it. All social impositions associated with it, including the idea of 'community-driven-development' are part of a recently-invented mythology with little basis in how things actually work, a mythology that embodies, cult-like, both a lack of support for diversity in the ways things can work and a pervasive sense of communal entitlement.

This striking contrast highlights an important question: how does a language grow?

  1. Communally, by figuring out how to be open and liberal with contributions while protecting stability
  2. Individually, by being a Lisp with strong macro support
  3. Tangentially, by leveraging use of another language

Honorable mention: Socially, by not castigating and exiling valuable members of the community (Tim and Chas).

In short, a "practical" language either needs a strong ecosystem (JavaScript - 35% of all Github PRs) or core features that make a strong ecosystem unnecessary (Rust - 0.8% of all Github PRs). And there's no reason you can't have both (C++ - 7% of all Github PRs). Clojure could choose one, the other, or both, but it seems to me that it has chosen neither (0.2% of all Github PRs). It has a decent ecosystem, and it has objectively strong core features (macros, immutability), but these aren't enough to justify committing one's career or company to. Especially not when the BDFL has told the entire world that you should count your lucky stars he is so benevolent.

Refs:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment