0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
/
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
/
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
ANNO·​TRICESIMO·​DIE·​DVCENTESIMO·​QVINQVAGESIMO·​QVINTO·​VITÆ·​POVYA
Visual Studio Code Support for @archive + Better Handles

I finally added a new grammar to the Archive so that I can have custom labels for Archive handles. I used to link people in the quotes to their profiles in Archive , and then it would sound so strange, and then I finally decided to have a grammar like @handle[custom label] support in the system. With all of this, it was also necessary to have a support for syntax highlighting in Visual Studio Code, so I created a new language called Archive Essay that supports handles and the Fermata () marks. I have to add support for the special quote language and stuff like these here and there as well…

AThousandYears:MyOrientalCompoundFeeling
A Thousand Years: My Oriental Compound Feeling
AWholeDifferentIdeafortheFutureofSoftwareProgrammingthatMightbeaRediscoveryofEve
A Whole Different Idea for the Future of Software Programming that Might be a Rediscovery of Eve
Quotes & Excerpts

What’s true of every bug found in the field? […] It passed the type checker. What else did it do? It passed all the tests. Okay. So now what do you do? Right? I think we’re in this world. I’d like to call it guard rail programming.

Right? It’s really, really sad. We’re like, I can make change cause I have tests. Right? Who does that? Who drives their car around banging against the door? I’m glad I’ve got these guard rails because I’d never make it to to the show on time. Right? And, and do the guard rails help you get to where you want to go? Like the guard rails, like guide you places. No, those guard rails everywhere. They don’t, they don’t point your car in any particular direction.

RICH HICKEY

What kind of runner can run as fast as they possibly can from the very start of a race?

Only somebody who runs really short races. Okay?

But of course we are programmers, and we’re smarter than runners, apparently (!), because we know how to fix that problem. Right? We just fire the starting pistol, every a hundred and call it a new sprint.

RICH HICKEY

So, what things are complex, and what are the simple replacements? I’m going to dig into the details on these. So I won’t actually explain [why] they’re complex. We’re going to say:

  • State and objects are complex, and values are simple and can replace them in many cases.
  • Methods are complex, and functions are simple.
  • Namespaces are simple. The reason methods are there is because often the space of methods—the class or whatever—is also a mini, very poor namespace.
  • Vars are complex, and variables are complex.
  • Managed references are also complex, but they’re still simpler.
  • Inheritance, switch statements, and pattern matching are all complex, and polymorphism à la carte is simple.

Okay. Now remember the meaning of [simple]. The meaning of simple means unentangled—right, not twisted together with something else. It doesn’t mean “I already know what it means.” Right? Simple does not mean “I already know what it means.”

  • Syntax is complex. Data is simple.
  • Imperative loops, fold—even fold, which seems kind of higher level, still has some implications that tie two things together—whereas set functions are simpler.
  • Actors are complex, and queues are simpler.
  • ORM is complex, and declarative data manipulation is simpler.
  • Conditionals are complex in interesting ways, and rules can be simpler.
  • Inconsistency is very complex. It’s almost definitionally complex, right? Because [consistent] means to stand together. So [inconsistent] means to stand apart. And that means taking a set of things that are standing apart and trying to think about them all at the same time. It’s inherently complex to do that. And anybody who’s tried to use a system that’s eventually consistent knows that.
RICH HICKEY

So there’s this really cool word called complect. I found it. Complect—I love it. It means to interleave or entwine or braid.

Okay. I want to start talking about what we do to our software that makes it bad. I don’t want to say braid or entwine because it doesn’t really have the good/bad connotation that complect has. Complect is obviously bad. Right?

It happens to be an archaic word, but, you know, there’s no rule that says you can’t start using them again. So I’m going to use them for the rest of the talk.

So what do you know about “complect”? It’s bad. Don’t do it. Right. This is where complexity comes from. Right? Complecting. That’s very simple.

Right? And in particular, it’s something that you want to avoid in the first place. Right? Look at this diagram. Look at the first one. Look at the last one. Right? It’s the same stuff in both those diagrams—the exact same strips. What happened?

They got complected. And now it’s hard to understand the bottom diagram from the top one, but it’s the same stuff. You’re doing this all the time. You can make a program a hundred different ways.

Some of them—it’s just hanging there. It’s all straight. You look at it. You say, oh, I see, it’s four lines, this program, right. Then you could type in four lines in another language or with a different construct. And you end up with this knot. So you’ve got to take care of that.

So “complect” actually means to braid together, and “compose” means to place together. And we know that, right? Everybody keeps telling us what we want to do is make composable systems. We just want to place things together, which is great. And I think there’s no disagreement, right? Composing simple components—simple in that same respect—is the way we write robust software.

RICH HICKEY
Day's Context
Open Books