Honestly, the primary challenge I encountered with complex codebases originated from adhering to SOLID principles. Surprisingly, they appeared to turn the straightforward task of making any changes into a Herculean feat. Introducing numerous cumbersome abstractions also took a toll on performance.

Talk about actual premature optimizations!

I much prefer something like CUPID principles. More information on CUPID