As Tony Hoare observed: There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies and the other is to make it so complicated that there are no obvious deficiencies.

— Kevlin Henney, 97 Things Every Programmer Should Know