Let’s talk about Systems Thinking.
🤔 Why you should care about it
“Systems thinking is the most universally useful toolkit I’ve found [to solve complex problems]” - Will Larson, CTO at Calm and author of An Elegant Puzzle
Software engineers usually solve software problems by designing software systems. What if you could solve human problems, like developer velocity or onboarding, designing human systems?
Events don’t happen in a vacuum —> many variables can impact a project or organisation, and making changes locally can sometimes have little to no impact globally.
It’s hard to anticipate the impact of a trade-off —> every choice we make has future advantages and disadvantages: the more options, the more complex the modelisation of their future outcomes.
Thinking in systems allows you to deconstruct a problem into interconnected elements to produce a function or purpose. For example, an engineering development process is a system with elements (stocks) such as user stories, pull requests or ready commits. Its interconnections (flows) are the coding rate, the code review rate or the deploy rate. The team's purpose is to release quality features fast into production.
💡 Key Concepts
Stocks —> a system stock is an accumulation of material or information built up over time.
Flows —> stocks change over time through the actions of a flow. There can be inflows and outflows. Every flow is a rate, whereas every stock is a quantity.
Limiting factor —> a system variable that causes a noticeable change in output.
Feedback loop —> feedback occurs when outputs of a system are routed back as inputs as part of a chain of cause-and-effect
”My organisation is too complex to be represented with simple stocks and flows.”
—> The map is not the territory. When using systems thinking, you can accept some simplification as long as it serves the problem you’re trying to solve.
“Systems disconnect you from reality.”
—> When your model and reality conflict, the reality is always right. It’s easy to fall for your model, but you should always consider real-world results to adapt the model (instead of looking for results to comfort your model).
“Systems thinking doesn’t take into account human beings.”
—> A model represents a system independently of the human beings who are part of its elements. When considering changing a variable or adding elements, you have to factor in human beings and act accordingly.