When the web started, it was a collection of hyperlinked, static pages. Then people started creating dynamic content and applications, and the web overflowed with cgi-bin directories.
The techniques for building these applications have become more advanced since then, with full-stack web frameworks like Ruby on Rails and Django becoming immensely popular. As the number of web users has grown, however, web apps have experienced difficulty scaling to fulfill the demand that a popular app can generate.
Even with consistently fast servers, the latency between those servers and your user is always outside your control. That means that even if you optimize your application as much as possible, every new request makes the user wait a minimum of a few hundred milliseconds. Compared to desktop apps, they just don’t feel as snappy, and impatient users can quickly turn into former users.
Recently, AJAX has been used to create web pages that can update without having to reload the browser. But they still feel like websites, and are usually limited in interactivity.