Nonlinear systems, like software projects, are complex because causes and effects are not easily distinguished.
Complex systems are called complex because these systems typically harbor multiple nonlinear chains of cause and effect. This is why the behavior of software teams is so hard to analyze and predict. A causal loop diagram (CLD) of a software project typically looks like a bowl of spaghetti with meatballs on a trampoline.
Reinforcing feedback loops
In a causal loop diagram we identify a reinforcing feedback loop (sometimes called positive feedback) when cause and effect are circular and an effect strengthens its own cause. For example, the low productivity of a team reinforces itself through low customer satisfaction, and low team motivation. In a CLD a reinforcing feedback loop is sometimes identified with a picture of a snowball.
Stabilizing feedback loops
We identify a stabilizing feedback loop (sometimes called negative feedback) when the effect weakens its own cause. For example, when a business really needs to fight for survival, there is an increased chance that people put in extra hours (temporarily increasing productivity), customers are dropped (decreasing pressure), or radical changes are implemented (driving business improvement). In a CLD a stabilizing feedback loop is sometimes identified with a picture of a seesaw.
Note: If a business survives despite all kinds of reinforcing feedback loops, as described in Story of a (Fictional) Doomed Software Business, then there must be at least one unidentified stabilizing feedback loop in the system.
Sometimes a cause has multiple opposing effects. For example, the threat of decreased revenues might increase the pressure by management on their software teams to improve. But at the same time it decreases the time and money available for such improvements.
Sometimes an effect has multiple causes. For example, low productivity of team members can be caused by low motivation, bad skills, bad discipline, and much more. If you try to find just one “root cause” in a team with low productivity you might be oversimplifying the situation.
Separation in time
And sometimes there is a separation in time between a cause and its effect (indicated with two dashes in the middle of an arrow). For example, investment in education should lead to improved skills of team members. But in most cases it will take a while for such effects to be realized.
Nonlinear systems, like software projects, are complex because there are multiple reinforcing and stabilizing feedback loops, multiple causes per effect and multiple effects per cause. If you intend to take control over a messy system, you will find it hard to determine how causes and effects relate to each other. It might be easier to untangle the spaghetti from your trampoline.