This is not more than a thought experiment, if you not into software philosophy probably this will be too boring. Abstraction is a ubiquitous word in software development, layer abstraction, storage abstraction, and so on. Abstraction is defined as the act of abstract and this word has some curious definitions:

"to consider apart from application to or association with a particular instance" "remove, separate"

In software development we often use abstraction with meanings similar to these. Remove or separate from something, in example, abstract the fact that you deal with computer memory. Separate your storage implementation details in order to deal with it like has a common idiom to persist data. Abstract the data structure and deal with objects, objects by definition are abstractions that actually have data and behavior but these are removed from your eyes (the API) so you can construct more abstractions by aggregating them.

My thought experiment is that software development is nothing more than abstracting to a user level acceptance. The interesting part is that this level changes over time, specially because we can reach more powerful abstractions given the growth of hardware capacity and new interfaces with users. If these words seem too abstract (pun intended), let me try to make a more concrete example.

Games are a good example, in the beginning they were text based, that was the interface we had, that was the capacity that we had to deliver it. Humans, played these games and like it, even with a great distance from the simple letters on the screen to their imagination. This phenomenon is well understood and used in the form of books.

Hardware evolved and games turn to have a more graphical interface, moving pixels got people excited, then 2D graphics, 3D and so on. As other softwares, browsers, social networks and even accounting. Whatever users are able to deal in an abstract level we try to reach, we try to develop interfaces that will match current user acceptance to deal with such abstraction. Might be the case that holographic interfaces (once invented) will be the only acceptable interface to browse the internet.

Keeping this line of thought, we can think about our current infra-structure to develop software. We have virtual machines that try to abstract the hardware, the hardware actually has software that tries to abstract itself, like how to write on the hard disk, access the memory or ask for the CPU to compute an instruction. Several levels of abstraction have to be in place for a piece of software be useful to a user, when this user is not an engineer inside the chain of making abstractions.

Thinking about this chain, we can see there's a limited number of abstractions that a developer to deal with, it is not feasible for a developer implement from the lowest layer to today's UI. Meaning that development nowadays needs at least some lower layers working and well defined in order to produce higher ones. On software evolution we see that more and more layers are being defined and more and more people are involved directly or indirectly. Correctness of lower layers is important in order to achieve stability on higher ones. As my friend Aravind SV wrote: "In my view, abstractions are one way of handling complexity within a system. Another way of abstraction is to actually hide it, by moving to smaller, totally independent sub-systems, which communicate with each other through well-defined interfaces."

There are a couple of questions that pop into my mind. With the quality of software developed nowadays is possible to have better abstractions in the future? Is all software doomed by its inherent complexity? Hardware is physics business, high cohesion on these rules, are we reaching the limit of our ability to develop software since it has no fixed rules?

Like firmwares, our current software has to be reliable and error tolerant to some level, if not, it will not be possible to grow new structures with foundations cracking. Businesses, not knowing this, if not thinking about quality of software they produce, are only producing stuff that will be replaced by other business software, the revenue that comes today will not resist evolution.