Notes from the Mystery Machine Bus

Free Beginner Workshop

From OO to Clojure Workshop!

Watch my free workshop to help you learn Clojure faster and shift your paradigm to functional.

Reference: Notes from the Mystery Machine Bus

Steve Yegge:

Software engineering has its own political axis, ranging from conservative to liberal.

Steve, I am so often with you. Typically, you write stuff that is very concrete and easy to agree with. In fact, I agree with most of what you have written in your very long rants.

But this, I am afraid, is bullshit. Not right, not wrong, just bullshit.

I was giving you the benefit of the doubt until I read your list of categorized features, either conservative or liberal. That list made absolutely no objective sense. There is not one shred of a good idea in the dichotomy you gave.

The dichotomy conflates so many different dichotomies into a single one in the name of clarifying a terrible mess. In that way, it makes the same mistake as classifying people into conservative and liberal does. It does not help explain anything. And it only creates more fighting by arming people with names to call each other.

Which is more "liberal", Common Lisp or C? Common Lisp protects against the most common types of C errors: memory leaks and buffer overflows. Does that make Common Lisp more conservative because it protects the programmer from errors? But C has compile-time type checks! And "conservative" syntax! Bullshit!

But then came the clincher. When you said that Clojure was a conservative language, I came up with something which may actually have some merit: how opinionated the language is.

Clojure is strongly opinionated. So is Python. So is Haskell.

Clojure's opinions: state changes should be explicit, values should be immutable, functions should be separated from data, etc.

Python's opinion: code should be well-indented.

Haskell's opinions: functions should be pure, types should be consistent.

These languages may appear conservative because, in their respective worlds, the opinions are solidified into laws and imposed on the programmer. Python does not allow you to write unindented code. Haskell does not allow you to write programs with inconsistent types. You cannot mutate a Clojure map.

Perhaps, Steve, you mean to say that you don't like when a programming language's opinion is imposed on the programmer?

I personally like some laws and dislike others. For instance, Clojure's immutability is great. It's not just great because it's possible. It's great because it is enforced. Nothing can change my values—not me, not you, not anyone! And I like Haskell's type system in production but not during development. I like that my program is guaranteed to have consistent types on production. But in development, I'd rather run it and debug it (for some definition of "run" for a type-inconsistent Haskell program).

If you say it like that, it ceases to be bullshit. And then we can get back into a discussion. Question: Which features should be imposed on the programmer and which should not? Discuss.