Recently I've seen lots of articles about avoiding complexity in software. The general trend is always: "Simple good, complex bad", "Avoid complexity", "Build small", etc.

Here is the thing: truly simple software usually sucks. That's why almost nothing that you're doing and using is actually all that simple.

Improvements in areas like: features, performance, robustness, security, reliability, availability, power savings, UX, etc. inevitably require introducing additional complexity. And simple software tends to not go very far in these.

I will not be happy with buggy, insecure, slow, hard to use software that drains my laptop's battery, just because "it's simple". I want it featureful, optimized and nice to use and if that means it's complex, so be it.

The right way to think about complexity is like money or wealth. Complexity affords us things. By "spending" it, we can improve things of our choosing. But no one has infinite budget, so we have to economize. This means there are generally no easy magic solutions that make complexity go away. There are just nuanced and often difficult decisions in given context about which things are worth the complexity, and which approaches are most economical one in given circumstances.

Oftentimes experienced/smart/knowledgeable people are able to reduce complexity, without loosing any benefits (or even gain some!). These are akin to resourceful and thrifty shoppers that are able to buy more while spending less, or a person that spends less dinning out because they can cook well. That's great, but different than an absolute "just spend less".

Proclaiming that "we should only write simple software" is like saying "we should just live like we're poor and broke". Not exactly an appealing proposition.

The right approach is to "spend complexity wisely", not "spend less complexity".

Also, oftentimes missing is the other side of the economical equation: earning. Being wealthy and having large complexity budget allows affording more things that complexity can buy. Certain programming languages, tools, practices deal with complexity better than others, and effectively makes us "wealthier". Investing in tools, infrastructure, documentation while having initial complexity cost, often pays handsomely later.

So it's not exactly wise trying to use the simplest/crudest tools just for the sake of simplicity if they don't afford us the complexity we need to thrive.

So go now, and make things better by adding some complexity to it wisely.