Software developers often find it difficult to calculate complexity, not because they’re stupid, but because it’s hard. An important distinction to remember when thinking about complexity is the difference between code and software development. The former is complicated and the later is complex.
Code is a static asset, it can be complicated but never complex. When we consider how complicated code is we often consider how understandable it is, how long it is, how testable it is, or how many paths run through it. There are even tools we can use to assess this for us. We can run Cyclomatic Complexity checks to tell us how many paths run through our functions, methods and classes. We can use Lines of Code tools to see how long it is. And we can even use CRAP scores to see how testable it is. Code complexity is containable, with care and attention it can be analysed and reduced.
Software development by contrast is very different, it is a process and therefore complex. It involves lots of different people, developers, testers, designers, managers, product owners, customers, sales people, business leaders and many others. Decisions and code emerge from the interaction of these people and the process of discovering what to build and how. None of these pieces can easily be assessed and the complexity cannot be easily calculated. Software development is a complex process and the complexity is difficult to contain.