The three kinds of code: 1. It's clear what this does. 2. After much thought, it's clear how the developer got here. 3. WTF.
— Eλf Sternberg (@elfsternberg) August 8, 2016
Sometimes it's a little hilarious to read the back-and-forth of academics. My favorite is this exchange from Roman R. Redziejowski and Brian Ford over packrat parsing. Redziejowski writes
PEG is not good as a language specification tool. The most basic property of a specification is that one can clearly see what it specifies. And this is, unfortunately, not true for PEG.
To which Ford responds,
Such permissiveness can create unexpected syntactic subtleties, of course, and caution and good taste are in order: a powerful syntax description paradigm also means more rope for the careless language designer to hang himself with.
No points for complaining that Ford ends his sentence with a preposition.
This exchange highlights an issue in the programming language community that stands out for me. There's a debate raging between two camps, with Google Go at one pole and Haskell at the other. Google Go is fundamentally an ugly language, one the designers admit up front is meant to make mediocre programmers productive, to constrain them from hurting themselves while making them capable of producing working code. And while it's fine for that, consider the Microsoft "wizards" of the mid-1990s that pumped out huge blocks of C++ that nobody, not even the template designers, could understand; when it comes to Go, that's where we're headed. On the other hand, Haskell is fundamentally a beautiful language that's really, really hard to understand; you have to immerse yourself in decisions where you, yourself describe the constraints with precision, with care, with taste.
Ira Glass has a speech, On Storytelling, in which he says, about being creative,
We get into it because we have good taste, but there’s like a gap.
The first couple years that you’re making stuff, what you’re making isn’t so good, It’s trying to be good, it has ambition to be good, but it’s not quite that good.
But your taste, the thing that got you into the game, your taste is still killer. And your taste is so good that you can tell that what you’re making is kind of a disappointment to you, you know what I mean?
The thing is, this is true of storytelling, of drawing, of any creative endeavor. A lot of programmers don't get into programming because they view it as a creative endeavor. They view it as puzzle solving. They view it as engineering. They view it as a way to make money fast.
They have no taste.
Often, they don't want to have taste. They want to get the job done and get paid. "Taste" slows them down and gets in the way. Aesthetic decisions about code layout and arrangement, they believe, are irrelevant to getting the job done.
This isn't true, of course; Tasteless Go is still as unmaintainable as tasteless C++. It's possible to write aesthetically horrifying Haskell. Let's not even talk about Perl.
I believe this is the fundamental dividing line betnween Go, C, and C++ on the one side, and Rust, Clojure, and Haskell on the other. The whole point of Go is make programmers with no interest in taste or aesthetics write programs that work. Maintainability is secondary.
Which goes back to my tweet above. Java and Go programmers want to write the first kind. Haskell and Lisp programmers and their descendents love to write the second type. But my experience with reading and writing in a variety of lanugages convinces me we frequenty end up at the third with no help for it.
The solution is to teach aesthetics. To teach people that readability and maintainability matter more than just getting the job done. That if it doesn't make you feel good the day after you wrote it, re-write it.
After all, sometimes your code will live much longer than you expect.