Earlier this year, one of my colleagues at Shopify noted that I keep asking for simplicity in our software and how we run our systems. He’s right. I do. Then, they dropped a bomb of a question: “What exactly do you mean by simple? Simple for who?”
I gave a quick answer that worked in the context of the conversation. However, it wasn’t really satisfying for either of us. It was too specific. It wasn’t something that could be more widely applied.
It was late, and we both had other places to be. So, I said that I’d give it some thought and come back with a better answer.
There are multiple definitions of simplicity. Even if you chose just one, it’s a quality that’s hard to measure and quantify. It’s even harder to achieve, especially when you’re working on large, complex systems at scale. On the other hand, it's entirely possible to make something too simple and force complexity into other parts of a system.
When I saw my colleague again, I had a better answer.
The simplicity I’m looking for isn’t just characterized by a lack of complexity. It’s also not just about minimalism. And it’s not about dumbing something down. Instead, its primary attribute is about being understandable to somebody well-versed in the craft.
When a skilled software developer approaches a project, it should be clear what the major components are and how they work together. The application’s state is stored here. There’s a queue used to decouple operations. Over there is a set of templates used to render output, and so on. Maybe the state is using a database they haven’t used before. And it’s possible that the templates are a kind they haven’t seen yet. But it’s obvious where to start, and what bits of knowledge need to be acquired in order to proceed.
That’s the simplicity that I’m looking for.
It helps manage complexity. It improves communication, allowing for more collaboration. It simplifies maintenance and reduces learning curves, especially by other people in the future that didn’t work on the original. It helps avoid over-engineering and keeps the focus on solving the actual problem. And, it helps scalability because it’s easier to understand how a system will behave as it scales.