Something CAN be done about legacy
It may seem that legacy--that is "old style" systems we've inherited or maybe even built but no longer like--is purely something we must live with now and forever. It seems inevitable that our current systems, languages, and applications are doomed to eventually collect dust and an occasional deriding comment from some new intern who doesn't even know what it is like to boot a computer using floppies. I say, however, nay! How can I say this considering that it's always been this way!? Stay with me. First let's establish that some things never go out of style. Like math for instance. Math hasn't changed much since computers were born, and isn't likely to any time soon... or late. Philosophers are still trying to decide whether math is somehow part of the universe, or if math is merely a cool abstraction we use to predict things about the universe. Regardless, it certainly does give us a useful tool for modelling and predicting actual things. Because of this, it has a timeless nature to it, even though we might change what symbols and tools we use to represent things.
Computer software abstractions are unavoidably related to math, though in many cases the relation may seem like a cousin-in-law's friend's neighbor once removed. It's actually this distance from more foundational principles that makes software so easily dated. In the name of problem solving us Software mechanics have evolved some awfully patched up monsters. This has been made possible by the kind hardware folks, who have been generous enough to make our obtuse layers of bandage-work actually perform in a reasonable manner (thanks guys). One of the many prices to pay for so much bad software abstraction is the rapid manner in which our systems become legacy. Legacy because they are so difficult and fragile to change that nobody wants to touch them. Legacy because they are so laden with complexity that it is nearly impossible to tease out and salvage the essence as platforms change. Legacy because we've got a newer better technology wheel we've reinvented and we must rebuild the old systems because now they just look old.
It's all of the non-essence stuff in our systems that makes us have to replace rather than extend or enhance them. Think of any given system as being made up of two parts: One part describes the essence of the problem for which the system was created, something like mortgage amortization, modeling customers and sales, or simulating paper documents. The remainder of the application is a description of how to deal with the other layers of technology, such as the user interface technology, expression of concepts within the programming language, or interoperability with other applications. The former is sometimes called essential complexity, the latter accidental complexity. A math formula doesn't become dated, because it contains minimal "fluff" and maximal "content". Imagine, however, if every few years we renamed all of the math operators, changed symbols, and required filled pages and pages to define simple equations. It sounds unproductive, but you could probably sell lots of silly little books with cutesy animal pictures on the front of them to help the poor mathematicians keep up.
The closer we get to systems which describe the essence of their mandate, the less likely they are to become legacy. In fact, it could be argued that as the accidental complexity approaches zero, it becomes impossible for a system to be dubbed legacy as it is merely a model of reality. Yes, of course the facet of reality being modeled could change, and so our VHS tape collection tracking software may no longer be needed, but that's not the kind of legacy I'm talking about. That does lead to a point however. It is the changing "real world" that spurs our need to change our software models. Given the information age, the "real world" for most domains is changing faster than ever. The software abstractions, on the other hand, are more complex than ever, demanding incredible amounts of accidental complexity to achieve anything. The result: J2EE, .NET with CAB, LAMP... and a burnt out industry unable to recruit young people because the job is [raise pitch of voice] "boring."
The solution is seemingly simple: minimize accidental complexity. Easier said than done right? Actually not really, but [stepping up on soap box] we must take advantage of the "mathematics of data" when modelling data problems. We must understand that everything we do, at all levels in the software stack, is data management. Missing this fact is tantamount to trying to model physics using basic arithmetic. We must define applications first and foremost in their "timeless" logical form, as a relational schema. I spent the last two days dealing with COM programming. I'll never get these back. We must stop thinking that API based abstractions are somehow going to solve a problem; think REST, SOAP, CORBA, DCOM, RPC, etc. Before I hop off of the soap box, let me vouch for myself. The prescribed approach DOES work and DOES minimize accidental complexity. I've now built several applications in Dataphor, a platform that only begins to realize the potential of declarative development, and I've seen that an application can truly be created from little more than defining structures which model reality. If a system is defined in a high-level, declarative way, let the trendy winds howl as they may, that system will easily evolve, and may not ever need to be replaced.
As a quick disclaimer, I am of course not naive enough to believe that the best technology wins and that politics aren't a primary force in the dynamics of why we are where we are. Nonetheless, I choose to ignore what I can't control and focus on what can be done in the present. Also note that a declarative softwaretopia is inherently opposed to "hiding" logic. This has all sorts of interesting technical ramifications, but it also has some interesting business ramifications. Perhaps the open source movement is laying useful groundwork.