Why do apps have to be async in the first place?

When we build sophisticated interfaces today, there’s an explosion of asynchronous code. All throughout your frontend code, you’re using promises, or core.async, or Rx. All these abstractions that are meant to make async things easier to work with. But the problem is that it had to be async in the first place. Why does this need to be asynchronous? Anywhere we do I/O, we need to consider the performance consideration. So our entire frontend application, every single line of code in it nearly, has to consider the performance cost of doing something, of fetching the data. And it’s the same on the backend. Our queries have latency, we have to optimize them by hand. We write complicated sql joins to avoid I/O. We manually parallelize. Correct error handling is hard and we always get it wrong. Our async abstractions have ways to propagate the error through our asynchronous pipeline, and like, that’s okay, but what if we could make it not fail in the first place? What if we could make failure impossible?
— Dustin Getz, LambdaConf, 2016 May