Back in my university days one of my lecturers told me that if you're in the computer industry for long enough you will see the same patterns repeat themselves.
The computer industry started with mainframes and time-slicing. We then moved to personal computers. Recent years have seen the rise of cloud computing, which is analagous to... mainframes and time-slicing.
Web browsers and mobile devices are used in a way very similar to how thin clients and terminals were once used.
Part of it is that technology changes the value proposition of many approaches. We now have more computing power on a desktop PC than most reasonable people will ever need. Microsoft has never recovered from this lack of built-in obsolescence to churn old versions of Windows.
But part of it is that the grass is always greener and people are constantly chasing the next big thing that will make everything better. You see this in programming too. C++ is the ultimate proof that the road to hell is paved with good intentions.
Apart from the rise of garbage collection, very few things have made real productivity differences in programming in the last 10-20 years.
Joel Spolsky[1] covered this:
> A lot of us thought in the 1990s that the big battle would be between procedural and object oriented programming, and we thought that object oriented programming would provide a big boost in programmer productivity. I thought that, too. Some people still think that. It turns out we were wrong. Object oriented programming is handy dandy, but it's not really the productivity booster that was promised. The real significant productivity advance we've had in programming has been from languages which manage memory for you automatically. It can be with reference counting or garbage collection; it can be Java, Lisp, Visual Basic (even 1.0), Smalltalk, or any of a number of scripting languages. If your programming language allows you to grab a chunk of memory without thinking about how it's going to be released when you're done with it, you're using a managed-memory language, and you are going to be much more efficient than someone using a language in which you have to explicitly manage memory. Whenever you hear someone bragging about how productive their language is, they're probably getting most of that productivity from the automated memory management, even if they misattribute it.
[1] : http://www.joelonsoftware.com/articles/APIWar.html