I'm writing a networked rpc "framework"[0], too! Can you summarize or point me to some resources that outline the aspects you find interesting? I'd like to be aware of them as I'm building and designing!
Ignores failure modes. The is_prime example takes an integer to a bool, and is put on the far side of a network call, but there's no change to the interface to indicate network failures and no fallback path to compute it locally if things go wrong.
(strictly it calls exit on anything going wrong, but as the whole problem with rpc is the extra failure modes that's not compelling)
nfs as originally designed could not fail. so what happens when something that can not fail has a failure? that's right it hangs.
On the one hand this was kind of fun, network problems, the application hangs waiting on nfs, two days later you get everything sorted out and the application comes back never knew there was a problem.
On the other hand, this is the most infuriating behavior possible, everything you touch on the system starts freezing up. and you wish it would just fail so you could fix the infernal thing.
Later the "soft" option was added so that nfs could actually fail.
It's true that error management is critical for a production environment, but from a pedagogic point of view, they can left as an "exercise for the reader".
As much as I am a big endian fanboy by nurture, the important thing is that the order is documented.
Also, I don't know if this is apocryphal, but as a wee lad I was told the tale that network routers worked faster because they could do coarse addressing faster thanks to seeing IPv4 addresses in big-endian, when the bytes trickled in one-by-one.
Great intro for more junior devs learning how it all comes together. It's incredibly easy to use these things without understanding what they are doing for you under the hood.