There is a deeper problem here: what is concrete in a UX?
Most software design has a rigidly defined UI. That means that the most concrete aspect of the UX is what the user is looking at.
But does this have to be true? Is it really a good idea? I don't think so.
---
A UI that always looks the same is inflexible. This has advantages and disadvantages:
Pros:
* The UI won't surprise the user. The user can predict where to go next, because the layout never changes.
* The UX is optimized for a "happy path".
Cons:
* The UI will never accommodate the user. The user cannot move superfluous UI bits out of their way. The user must always contend with the entire app all-at-once.
* Any flow that is not the "happy path" becomes a maze at its best, and a fortress at its worst. The user's ability to introduce novel UX behavior is either minimized or outright banned.
---
We are approaching this subject with what we are used to: GUI. Let's take a step back in time, and think about text user interfaces (TUI). Let's think about shells.
What is concrete in a shell's UX? Not what you look at, that's for sure! Not the behavior, either! Hell, even the environment is flexible! Is there anything concrete?
The abstraction. That's the stable part. Shells have environment variables, stdin, stdout, stderr, signals, pipes, etc. We can't predict what will use these abstractions; but we can predict that whatever it is, it will use them.
So how does a user learn to use a shell? They learn the abstract thinking first! Pretty convenient, isn't it? Sure, there is a high upfront cost, but that only needs to be paid once.
The pros and cons are essentially the opposite as above.