I wrote about the complexity budget a few weeks ago. But I want to be precise: complexity itself is not the enemy.

Every real domain has inherent complexity. Insurance has exceptions. HR has edge cases. Invoicing has tax rules that differ per country, per product, per quarter. You can't simplify that away. If your software pretends the domain is simple, it's wrong. The goal isn't less complexity, it's making sure the complexity in your code matches the complexity in the domain. Accidental complexity (the kind you introduced through bad abstractions, wrong boundaries, or copy-paste decisions) is the part you fight.

But there's a third kind nobody talks about: product complexity. Beyond accidental complexity, having a product that's too complex kills it too. Every feature you add is a thing users need to understand, support needs to explain, and developers need to maintain. Sometimes the right move isn't refactoring the code. It's cutting the feature.