it's pleasant in Erlang for a lot of reasons and due to a lot of past work. You can go with message-passing only, as a discipline, even with C11 threads, and you wouldn't have nearly as good as a time. For example, if you somehow managed to deadlock an Erlang system, you can connect a shell to it, look at the running processes for your application, realize that they're all waiting for a message, and then say "I should have used the industrial-strength concurrency pattern library that Erlang also offers."