His conclusion is even this:
> Coming full circle, I must admit, the DRY principle is a pretty important piece of advice after all
So DRY is fine. Just be sure you're deduplicating for the right reasons. Like every other "rule" we have out there for programming, there are caveats and you shouldn't be blindly applying rules.
I hate people like this.
Don't Repeat Yourself. Too many developers look at this principle with refatoring in mind, a lot more than it should be.
If you have duplicate code, and by duplicate, i mean exact copy, then this principle applies. A 90% duplication is not a copy. It's close, but it's not a copy.
Abstractions often come with a much higher cost than duplication. It's much easier to get your abstractions wrong than it is to keep things stupid and repetitive.
Time is your friend here. Don't ever start abstracing, introduce it slowly and a small bit at a time.
> you can't change one without the other.
That's just nonsense. All the coder has to do is either make the shared code parametric or take a copy of it and hack it until it works (choose the approach that makes the most sense at the time). Alright, now it isn't shared, but so what? You can't always predict with certainty that the clients won't share the code at some distant point in the future any more than you can predict before writing it which bits of code will definitely be candidates for sharing.
As an example, I'm currently writing my own programming language at the moment for board games. I'm prioritizing shipping a game for my friends and myself to play, and this is forcing to leverage WET a great deal because I do not have the primitives yet to even contend with DRY.
Now, interestingly enough, this has been fortuitous since I have many touch-points which enable specific tweaks influence by game rules. Without WET, I could see myself not making progress or refactoring endlessly.
This is leading me down an interesting path, and I'm finally old enough to appreciate that things are going to be messy and weird.
Copy & paste is a fundamental principle for reason. Just when it becomes a burden you need to abstract.