I entirely disagree with this. The worst codebases I have worked on have been the under-engineered ones - everything you touch affects a multitude of unknown, unrelated things, and unravelling that sometimes borders on impossible. You can't put any unit tests in place because everything depends on everything else, so good luck refactoring with any confidence. Give me an overengineered codebase any day of the week - it's much easier and safer to put multiple little pieces back together if they don't really need to be separate, than it is to disentangle one giant lump.