When you’re managing software development projects, you need to know the difference between complex and complicated. Not knowing this difference means you might apply exactly the wrong approach to the right problem. (Or, if you prefer, the right approach to the wrong problem.)
It’s a simple message, really. But if you don’t get it, you’re headed for chaos.
Complex = not fully knowable, but reasonably predictable.
Chaotic = neither knowable nor predictable.
My car key is simple. It took me about three seconds to understand how my car key works. OK, maybe that’s not quite correct. Mine has a battery in it. If I take it apart it might take me another three hours to understand its details. But yeah, I’m smart, I’ll manage.
My car is complicated. It would take me years to understand how my car works. And I don’t intend to. But if I did, then some day in the far future I would know with certainty the purpose of each mechanism and each electrical circuit. I would fully understand how to control it, and I would be able to take my car apart and reassemble it, driving it exactly as I did before. In theory, of course. In practice, only real men do things like that.
Car traffic is complex. I can travel up and down the same street for twenty years, and things would be different every time. There is no way to fully understand and know what happens around me on the road when I drive, how other drivers operate their vehicles, and how the people in the streets interact. I can make guesses, and I can gain experience in predicting outcomes. But I will never know for sure.
Car traffic in Lagos (Nigeria) is chaotic. When things get too complex, they easily become chaotic. Traffic in Lagos is so bad, it is not even predictable. Poor infrastructure and planning, heaps of waste, pollution, lack of security, floods, and many more problems make it one of the worst places in the world to be, as a simple car driver.
My computer is complicated. My software project is complex. My house is complicated. My household is complex. My blog is complicated. My thoughts are complex. Your dinner is complicated. Your dog is complex.
Simple and complicated systems are all fully predictable.
The main difference between predictable systems and complex systems is our approach to understanding them. We can understand simple and complicated systems by taking them apart and analyzing the details. However, we cannot understand complex systems by applying the same strategy of reductionism. But we can achieve some understanding by watching and studying how the whole system operates.
What’s important for managers is that this also works the other way around. We create complicated systems by first designing the parts, and then putting them together. This works well for mechanical things, like buildings, watches and Quattro Stagioni pizzas. But it doesn’t work for complex systems, like brains, software development teams, and the local pizzeria. We cannot build a system from scratch and expect it to become complex in the way that we intended. Complex systems defy attempts to be created in an engineering effort.
Complex systems are not constructed, they are grown.
Some people picture complexity as a state that somehow surpasses that of complicatedness (see next picture). But this view is incorrect.
“Complicated” refers to a system having many parts, making it somewhat harder to understand, whereas “complex” refers to a system being not fully predictable. What is complicated is not necessarily complex, like two cars in a garage. And what is complex need not be complicated, like two people in a bedroom. (But what these people do in the bedroom can be quite complicated. And unpredictable.)
The correct picture might be something like the one above. In one dimension systems are either simple or complicated. This depends on the number (and type) of parts, and our own ability to comprehend them. There’s a fuzzy line between the two, as some people (our partners in particular) have more trouble than others at understanding even the simplest things.
Then there’s a second dimension in which systems are either predictable, complex or chaotic. You can see that we may apply the same distinction (simple vs. complicated) to both complex and chaotic systems, since some of these have parts that are either easy to comprehend (e.g. water molecules) or easy to count (e.g. pieces in a game of chess). But most complex systems are not easy to understand, which is why people often assume that every complex system is complicated as well. Software projects, whether simple or complicated, are always in the middle tier: they are complex.
When you manage a system, you need to know whether it is either predictable or complex. If you take the wrong approach to building or managing such a system, you’re either blow-drying your pizza, or microwaving your dog. And chaos might unfold.