This 2002 article by Paul Graham contains the following remark:
as software shifts off the desktop and onto servers (a future even Microsoft seems resigned to), there will be less and less pressure to use middle-of-the-road technologies.The move from the desktop to the server indeed allowed the blooming of frameworks and languages. But more than 10 years later, there is a clear move back toward the client: with so-called native apps on one hand, and of course in the browser on the other hand.
Which makes me think about the question of where computing should take place. Cloud resources are getting cheaper and cheaper, which argues in favor of more computing in the cloud. But personal devices are also getting cheaper, more powerful and more networked, which argues in favor of more local computing!
I like to think of a future where computing is really mobile, and by that I don't mean "running on a mobile device", but able to move from one device to the other as needed. Depending on latency, connectivity, storage, CPU cycles, power requirements, and pricing, the physical location of computing would change.
Big services such as Google and Facebook try to reduce the amount of computing and storage that every user needs, for obvious cost reasons. But what if everybody had his own computing nodes (in the cloud or in your pocket - after all we have this thing called the Internet connecting things), usable by any service (given permission)?
Google today does not, for example, dedicate a thousand dollars of computing resources just for you (especially as you're not directly paying Google for that). But you might be willing to provide these resources. In fact you probably already have these resources, with your laptop, mobile phone, and other computers, and odds are that in the future you will have much more.
What would it take to get there? The biggest obstacle is designing the software. You need a standard way of describing software (i.e. bytecode, a VM, APIs, and metadata), securing it, and create virtual networks. You also need a way to figure out how to handle the location and mobility of data. You probably also need a way to suspend computation on a device, and resume it on another one. Finally, you need a lot of intelligence to make this actually work.