Software is predicated on the concept of abstraction. Below all software is electricity, which represents 0’s and 1’s. The flow of the electrons are controlled by logic gates that are made by tiny switches called ‘transistors’.
Because companies consortiums create accepted standards and ‘contracts’, we’re able to represent a series of ‘on’ and ‘offs’ as symbols, like the letter ‘a’ or the number 10. The amount of 0’s and 1’s we store are called bits and bytes (a bit is one 0 or 1, while a byte is 8)
Up this pyramid we go, where bytes turn into images, into music, into logic that we call software, but beneath it all it’s just electrons flowing through switches.
For a programmer (or a user) abstraction is helpful because all that complexity is HIDDEN. The programmer only has to think about the logic constructs to create the desired behavior from the computer. While the user doesn’t even have to think of the logic construct, just the expected behavior of their devices.
Everything works great! Until they don’t, and something breaks. That’s when we have to go down the abstraction layers. From debugging software... to pulling plugs.