The challenges of asynchronous programming