All that abstraction has a cost. Additional compute time (and energy) to work through the abstraction layers. Having to debug someone else's code when it doesn't "just work". Having to re-write the abstraction layer when your work no longer fit within the defined parameters of the abstraction.<p>Frequently, the benefits of developer productivity outweigh these costs, but when an abstraction falls apart, it has a tendency of doing so spectacularly.<p>I tend to think of abstractions like those mentioned in the article as land mines full of technical debt. At first, it's easy to avoid stepping on them. But eventually you will step on that landline (perhaps even intentionally), and when it does, your productivity is going to suffer severely.<p>The analogy fits in one other way: the cost of clearing those abstraction land mines is disproportionate to the cost of putting them in your code in the first place.