I think that a good abstraction is not always obvious. For example, in our old code base from 2008, which is still in production and extended, the main idea was inheritance can solve DRY. Many developers still stick to abstract class just to save a few lines where they could go with a strategy or just split up.
I wouldn't call this over engineering. I call it laziness to learn and refactor.