In software development, we aim for predictability. At the same time, we deal with unpredictability, surprises in production. It feels contradictory sometimes.
I’m reading a paper: “Toward a Learning Progression of Complex Systems
Understanding” (Yoon, pdf). It looks at ways to teach complex systems. They categorize student responses on a scale from “clockwork” to “complex.”
In the “dynamic process” aspect of systems, these categories are:
- Completely Clockwork: The system is composed of static events. Even perturbations resolve into an outcome with a definite end.
This is what we aim for with event-driven programs, and with functional programming: clockwork. Given particular input, the output is always the same. - Somewhat Clockwork: there’s static events, but these events might take time to reach the outcomes.
Eventual consistency! With anything over the network, we aim for getting a predictable outcome eventually. - Somewhat Complex: there’s something of an ongoing process. Perturbations have longer repercussions. Outcomes are at a larger scale than the initial events.
This reminds me of a software activity with humans involved. We see these properties in the funnel from hitting the site to completing an order. Slowness in one place may eventually resolve to abandonment. - Completely complex: the system is an ongoing, dynamic process. It’s always in a state of flux. Parts adapt or evolve.
This describes the full production system, with various services changing at different rates, with humans affecting the load on the system, and the system’s behavior impacting humans.
As software developers, we get to interact with the system at all these scales!
Is software clockwork? Yes, within one function or process and without surprising side effects.
Is software a complex adaptive system? Absolutely, in a distributed system, in production, interacting with users and with developers as it goes.
Clockwork is the best! … on short timescales, small physical scales (one computer), and without human interaction. For everything else, there’s complexity.
Part of growing from entry-level to senior developer is: get the clockwork nailed, and move on to understanding complexity. Trust me: it gets to be even more fun.