@Nick Smith Lets say you've got a program that is manipulating data in an array. If that array exists on your computer in memory, your language can express iterating over that array as a trivial concept (for loops, streams, sequences, take your pick). What constructs do you have to use if part of that array is in another machine, or in a database, etc? The language and its view of the world completely breaks down. You now have to spend X LOC writing clunky code that's abstractions over some OS syscalls to get that array close to hand so that the language can resume (and you can't resume unless you can bring the array close to hand!).
As humans we can express "part of this array is _over there_", but the languages we use have no concept of "_over there_", there is only here. It's not a problem about abstracting over the oddities of networks, though that does play a part, its a problem of expressing over there in a computer language. This is all a rant to say that I think distributed systems are entirely a language problem 😛