An abstraction is a boundary with two sides. On the top side, the abstraction presents a simplified view. Below, there is something more complex and more real. The purpose of the abstraction is to obscure what is really going on.
The world hidden underneath an abstraction is quite likely to be yet another abstraction. In fact, it is typical to have many abstractions stacked together, each one attempting to present an illusion which is even further from the truth. If you stack them up vertically, the ones at the bottom are more real than the ones at the top.
This is what programmers do. We build piles of abstractions. We design our own abstractions and then pile them up on top of layers we got from somebody else. Abstractions can be great. We use them because they save us a lot of time. But abstractions can also cause lots of problems.
So begins a great essay on the programmer practice of building abstractions and using them. Like Rafe I’m disappointed he ends such a great piece with evangelism (.NET over Java), but again, like Rafe, I feel you can ignore it. A good read.