Programmer’s complexity tolerance

Najaf Ali
Kickstart your developer career
2 min readDec 15, 2015

Your tolerance for complexity is your ability to understand progressively more complicated systems. In our definition, complexity in systems means that the system has a large number of internal sub-systems that interact with each other in different ways.

Don’t confuse familiarity with understanding. Just because you’ve seen the padlock icon in your browser doesn’t mean that you have a meaningful understanding of the inner workings of TLS. The true test of whether or not you understand a system is that given a starting state and a set of inputs, you can make meaningful predictions about it’s behaviour.

It would be nice to live in a world where we don’t have to understand complex systems. We’re told by programming guru’s to strive for simplicity. Often this is without any useful definition of simplicity, but even if it was, our software doesn’t exist in a vaccuum.

We’re forced to work with software created by other people in combinations they never intended their software to be used in. We interface with old, internally complex systems like relational databases, DNS, OS memory management and programming language interpreters. We don’t really have a choice but to build software atop these eye-wateringly complex foundations.

It’s very easy to associate the ability to understand complex systems with some form of innate intelligence quality in a developer. Focusing on genetics in this way is toxic. Even if understanding systems is more nature than nurture, worrying about being less intelligent than the next person isn’t a productive use of your time.

I call this attribute “complexity tolerance” because like other tolerances, it can be developed and maintained. You can work on progressively larger and more intricate software projects to build your tolerance for complexity. You can dive into the inner-workings of open-source software that your code depends on. If you’re a freelancer, you have the opportunity to cut your teeth on old, legacy codebases on a regular basis. You can push yourself to implement data structures and algorithms that are just one or two more steps outside your comfort zone.

There are ways to lessen the need for complexity tolerance. You can deepen your understanding of the sub-systems around the thing you’re working on. You can learn ways of breaking down systems so that you’re better able to manage complexity. These are extremely valuable and you will be compensated handsomely for both, but they’re not the topic of this article.

But there’s something to be said for developing your ability to understand intrinsically complex systems. If your day job involved lifting heavy objects, it would be equivalent to spending time in the gym lifting weights. You don’t need to do it but it would certainly make your job easier. As a programmer it would open up fields and subjects that you’d otherwise fear to attempt.

--

--