Posted
I recently thought of a neat analogy to explain the tradeoffs of abstraction: guitar vs piano.
Playing guitar or piano means using your fingers to make strings vibrate. But with guitar, you do that directly (by strumming or picking); with piano, via an abstraction (keys).
On the piano, the keys are the interface and the hammers hitting strings are the implementation.
This gives opportunity to change things.
You can change the implementation to be an organ, a synth that plays trumpet in a different key, whatever.
You can change the interface to be a machine that plays the piano ("player pianos" in the old days) instead of keys.
So the abstraction gives a lot of power.
On the other hand, having no abstraction with guitar makes it hard to do any of that. But direct access to the strings means you can do all kinds of things that "hammer hitting strings" doesn't allow.
With guitar, you can bend, scrape, tap, thump, and mute the strings, because you're touching them directly. You can use the full potential of the guitar itself because you don't treat it as a generic instrument.
Software abstraction has similar tradeoffs. Eg, you could abstract away the differences between MySQL, PostgreSQL, and Redis, and use the lowest common denominator. This would make switching very easy. But you'd lose the chance to use each to its full potential.
As with any tradeoff, there's no universal "best choice".
Abstraction is like a piano. Lack of abstraction is like a guitar.
Play whatever sounds best in your song.