Good abstractions are powerful. They enable us to build complex systems without getting lost in complexity. But we must recognize that abstractions are not free. They have real costs, both in terms of performance and complexity. And if an "abstraction" isn't hiding complexity but is simply adding a layer of indirection, then it's not an abstraction at all.