One of the ways I think about software is meaning vs mechanism. We make software for people. It serves somebody in some purpose that they have. That's the meaning. But beneath, we have these very simple-minded machines, CPUs, and everything has to be expressed to them. That's the mechanism. In between there are many, many layers.
As developers, we have to love both. And as we work on software, our perspective has to shift all over that spectrum. But ultimately I think the we get the best software when mechanism is in service to meaning. And I think a lot of software goes wrong when mechanism is honored over meaning. When convenience to a programmer working on a deeper layer ends up more important than convenience to the user.