Clojure Tip 💡

Design is about pulling things apart

I think it was Rich Hickey who said this. It’s a big part of the philosophy of Clojure and its community. Pulling things apart is why we have reducers. It pulls apart folding from order so it can be parallelized. Pulling things apart is why we have transducers. It pulls apart sequence operations (like map: do f to every element) from where you find the items (sequences or core.async channels). It’s also what lets Datomic scale reads separate from writes. And of course, there’s the term decomplect.

I don’t now if design is only about pulling things apart, but it’s a big part of it. Pulling things apart lets you get really granular when you’re controlling things. So much complexity comes from not having the precise control you need. Instead, you’re doing workarounds, which add complexity. If you could just get down a layer, where things are controlled separately, you could do just what was needed.

But it’s not easy. The first step is to recognize the problem. The second step is to see that maybe things could be separated. Third is figuring out how to separate them. This third step is usually a messy, iterative process with many experiments. You won’t know if you can succeed until you do.

Even if you don’t succeed, it’s worth the effort. You’ll learn a lot.

Just finished reading 📖

Well, what a great book. It came out in 1995. Complexity theory was so hot then, and this book had a lot to do with it. By working with computational models, Kauffman explains a lot about our universe and why there is life. After reading a few chapters, I was very convinced that life is inevitable. The details are random, but it’s quite easy to reach a critical mass of proteins that self-catalyze. Once you’re over the threshold, you get a mess of new proteins, and those new proteins make it even more likely to catalyze.

It made me think a lot about computation. What can we learn from life to design distributed systems that are vastly larger than we currently do? How can you guarantee that it will converge on an answer?

This book has not changed my life, but I think it could have if I had read it when I was younger. In High School, I was getting into Complexity Theory and Artificial Life, but I never came across this book. If I had read it then, it may have altered my path substantially.

Book status 📖

Well, I am confident now that the book will be published very soon. It was in process internally at the publisher for a while, but it looks like it could emerge this week. Yes, it has been stressful. I want my book out there, and if the messages I get are any indication, many people also want it. But the publisher is making it as good as they can before it comes out.

I’ll keep posting about it weekly in the newsletter. Or you can sign up for the book-specific launch list here.

Currently recording 🎥

I am now recording a course called Property-Based Testing with test.check. Property-based testing (PBT) is a powerful tool for generating tests instead of writing them. You’ll love the way PBT makes you think about your system. And you can buy it now in Early Access. Of course, PF.tv members have had access since the beginning, along with all of the other courses.

Last week I said that there were three more lessons for properties, and here I am showing you only two. I reviewed the notes for the third one and I had already covered everything. Soon we’re going to get into real testing examples. But before that, we have to talk about shrinkage.

Members already have access to the lessons. The Early Access Program is open. If you buy now, you will get the already published material and everything else that comes out at a serious discount. There are already 6 hours of video, and looking at my plan, this one might be 9-10 hours. But that’s just an estimate. It could be more or less. The uncertainty about it is why there’s such a discount for the Early Access Program.

Clojure Challenge 🤔

Last week’s challenge

The puzzle in Issue 338 was to write a function that created the derivative of a function using the limit definition of the derivative.

The challenge this week is to use four differentiation formulas to make a symbolic differentiator. It has been a while since I’ve done any calculus, so I had to look these up:

dc/dx = 0 (for a constant c, or variable c different from x)

dx/dx = 1

d(u+v)/dx = du/dx + dv/dx (addition rule)

d(uv)/dx = u(dv/dx) + v(du/dx) (product rule)

This won’t differentiate every formula, but it will differentiate sums and products of variables and numbers. You should make a function that takes an expression and a variable to differentiate by, like so:

(deriv '(+ x 5) 'x) ;=> (+ 1 0)

Don’t worry about simplifying the final expression. Just make sure it’s right.

As usual, please send me your implementations. I’ll share them all in next week’s issue. If you send me one, but you don’t want me to share it publicly, please let me know.

Rock on!
Eric Normand

Footer CTA

Get the newsletter for free

The PurelyFunctional.tv Newsletter is a weekly email to inspire functional programmers.

Enter your email address to receive emails about Clojure and Functional Programming. These include the weekly newsletter and other great offers. You can unsubscribe any time.