I find this topic insanely confusing because when it comes down to the definition of abstract, it literally means something like conceptual, or not full, which contradicts the practice of implementing ideas into reality for better understanding. Anyone know any programming languages that explore this concept in a very interesting way? I am exploring this idea in an attempt to understanding programming languages and how they could be improved, re-wamped. Just... abstraction...
Computers are abstractions all the way down.
Nearly any time we (as humans) can abstract processes away under a simple description, we (as humans) are more productive.
Being a sum of operations rather than a one time evaluated result since the inputs can always vary, which leads to a different output, is a form of abstraction, true? Couldn't one consider the concept of pointers or references as abstract, since they constantly reflect on their reference object every time they are used / called, which mirrors the essence of being the sum of its operations, since it always re-evaluates upon use. Classes can be considered abstract and are better seen so in prototype-based languages since they are templates with non-implemented identifiers or functions which always vary during run-time as instances.
Simple example: the abstraction we use "Open a web page to {site}." That is an abstraction that most computer-savvy people are comfortable with.
In the late 90s that meant giving people exact instructions on going to their computer, finding and opening a web browser, going to the location bar on the browser, and typing in "H T T P, colon, yes that is the two dots, slash, slash, that is the one leaning to the right with the question mark key, w, w, w, dot, that means the period button, ...."
For computers, opening a web page is an abstraction for parsing a URI to get the host and the message, opening a connection, sending the request, interpreting the response, repeating the process for all the resources like images and style sheets, then composing the results into a nice pretty pictures.
Each one of those are abstractions, opening a connection to the host is an abstraction for the system looking up DNS entries, which itself starts with an abstracted-away process of the systems' DNS cache then finding the results, that cache is an abstraction away from some actual data structures, which are an abstraction away from the system's virtual memory, which is an abstraction away from the hardware's actual memory, which is an abstraction away from the system's components, which is an abstraction away from the actual chips, which is an abstraction away from the circuits.... etc.
We use abstractions all the time. As game developers we need to be careful of our abstractions because many have hidden costs. But thinking in abstractions is very useful.
When you are implementing new features and systems, thinking in abstractions enables powerful transformations and lets you figure out communications patterns fairly easily. The game objects get added to the game world and then all communications go through that channel. Adding to the game world means a process to get added into spatial trees, get hooked up for collision detection and collision response and pathfinding and registering for events, etc.
Then we have abstractions for all our libraries.
Commands to open a file are abstract, it does whatever magic it needs to get the disk caches working, to open files if they are on the local hard drive or USB drive or optical disc or even somewhere on the network, or even back in the day prompting the user "Insert diskette into drive A:" or a process to load a tape cassette. Then it magically buffers data and does a bunch of other work that I don't keep track of.
Abstractions are what enable us to build complex software, and to stand on the shoulders of the giants who came before building those systems.
Get comfortable working with abstractions, they're a good thing.