I think with the popularity of microservices, this issue has become a more prominent discussion at code reviews, design meetings etc. There are obvious places like Contracts to be the best abstraction and even distributed in a private package manager feed so that you avoid duplication and don’t repeat yourself.
However, as mentioned in the article, the cost of wrong abstraction in the form of reusing some code piece between microservices is pure evil and strong coupling. It leads to big ball of mud and distributed monoliths.
When they altered their point of view from “I must preserve our investment in this code” to “This code made sense for a while, but perhaps we’ve learned all we can from it,” and gave themselves permission to re-think their abstractions in light of current requirements, everything got easier. Once they inlined the code, the path forward became obvious, and adding new features become faster and easier.