A common saying in computing is that “Security is inversely proportional to usability”… or something like that. As we critical examine the security of our systems, we realize we need to put measures in place that make the system harder to access and thus harder to use. A good interaction design can help mitigate the usability issues, but at the end of the day a system that doesn’t require me to memorize a password or login is easier to use than a system that does.
We can say definitively that security and usability exist in tension.
As software architects we seek simplicity in our designs in the name of maintainability, if not intelligibility. We also seek modularity in the name of reusability. I submit that simplicity and modularity exist in tension.
Accepting a priori that simplicity is the absence of complexity, we can obtain the simplicity of a program by measuring its complexity. A field of computer science called algorithmic information theory defines the complexity of something to be the length of the simplest program for calculating it. We might infer from this that a monolithic program (no components, no objects, no abstractions, etc.) is a simpler program than our common object-oriented code. In general we can say that modularity implies no small increase in the use of abstractions to enable that modularity.
In object-oriented* systems, an increase in modularity results in a proportional increase in complexity.
I limit this to object-oriented systems purposefully. In my experience functional programming languages modularity is de rigueur.