One of the biggest debates in the software industry is about getting the level of abstraction right. By this I mean a level of interaction with computers higher than binary code or machine language - in other words, anything that presents humans with a more natural or intuitive abstraction of a CPU's instruction set and binary data storage format.
Computers are after all fundamentally stupid electrical systems that have to be told exactly what to do. At the end of the day, everything is just 1s and 0s - the bit is either on or off. But it is really hard for us humans to work with computers at that level, so we keep trying to make it easier for people to tell computers what to do. Getting the abstraction right is key to developer productivity, but it's a constant struggle. Abstraction layers typically remove flexibility and control from one level in order to simplify things at the next.