This article is very rambling and somehow manages to miss the most important driver of reduced software quality: shifting requirements.
You can have the most beautiful perfect design that leverages the greatest abstractions in the world, and then have it all entirely destroyed by a single requirement shift that totally kills your abstractions.
If the design is so inflexible that a single requirement shift destroys it, then it wasn't a good design.
well you cannot design for the unpredictable, but well designed code will make refactoring easier anyways