Why is software so complicated?

I often hear people ask this. Sometimes the question also takes the form of an accusation: “If (cars|houses|bridges) were like computers…

Joking aside, I think it’s important to remember that software is complicated by design. The entire purpose of software is to be complicated.

In the beginning, there was hardware. Hardware was hard: hard to build, hard to change, hard to distribute, and hard to update. As the complexity of the systems engineers wanted to build grew, the hardness of hardware quickly became a problem. Every time you found a bug, you had to do a new factory run. Every time you wanted to add a feature, you had to ship a replacement unit to your customer.

Engineers saw that hardware was hard, and created software. The purpose of software was to encapsulate the complexity of a system in an easily mutable form, so that it could be studied, audited, versioned, and updated.

So why is software so complicated? Because we want to build complicated things. Things with lots of features and options. Things that require thousands of computers spread across multiple continents. Things that can go to Mars and back. Things that drive themselves on the freeway. These things that we want to build are inherently complicated. Software is just the distillation of that complexity. Software is complexity.

Don’t get me wrong: complexity sucks. Every software project should be as simple as possible.

But the goal of software engineering as a whole is to increase complexity: to enable the construction of ever bigger, bolder, more powerful, and more complex things. Complexity is both our nemesis and our purpose. And we can no more escape it than the sailor can escape the sea.