This article says it well. I am glad I am not alone.
I have applied the DRY principle numerous times. Sometimes I found myself messing with the abstract class or common function again and again, introducing more and more switches to deal with various combinations of params. In those moments, I secretly hoped that there was no abstraction at all. May it be repeated code, coz at least when I tweak one thing I know that I am only tweaking one thing but not the rest of the dependent code. DRY is a good principle for sure, but I hope that we don’t just blindly follow it to write “good” code.