> This is the question and I would disagree. Hiding the asynchronous nature of any given function is a dangerous illusion.
I understand where you are coming from. However, in my experience, it's "turtles all the way down". Pre-emptive multi-tasking, NUMA, multiple CPUs, CISC, all add their level of asynchronicity to your program execution whether you are aware of it or not.
The right answer in this case is "hiding the nature of async under the hood". Yet, we've seen in a few cases recently, e.g. the recent CPU bugs, where this isn't entirely possible.
> ultimately lead to programs that are difficult to reason about and often don't perform well because developers lack any real control over concurrency
My experience has been the complete opposite. It's hard to make complex parallel programs and reason about execution, but concurrency primitives like fibers and reactors are a negative overhead abstraction which makes code simpler and easier to understand and therefore allows us to do more complex things with the same cognitive potential.
I understand where you are coming from. However, in my experience, it's "turtles all the way down". Pre-emptive multi-tasking, NUMA, multiple CPUs, CISC, all add their level of asynchronicity to your program execution whether you are aware of it or not.
The right answer in this case is "hiding the nature of async under the hood". Yet, we've seen in a few cases recently, e.g. the recent CPU bugs, where this isn't entirely possible.
> ultimately lead to programs that are difficult to reason about and often don't perform well because developers lack any real control over concurrency
My experience has been the complete opposite. It's hard to make complex parallel programs and reason about execution, but concurrency primitives like fibers and reactors are a negative overhead abstraction which makes code simpler and easier to understand and therefore allows us to do more complex things with the same cognitive potential.