Another reason for the quality gap is that that we've been having trouble keeping talented people. Google and other large Seattle-area companies keep poaching our best, most experienced developers, and we hire youths straight from college to replace them. You find SDEs and SDE IIs maintaining hugely import systems. These developers mean well and are usually adequately intelligent, but they don't understand why certain decisions were made, don't have a thorough understanding of the intricate details of how their systems work, and most importantly, don't want to change anything that already works.
These junior developers also have a tendency to make improvements to the system by implementing brand-new features instead of improving old ones. Look at recent Microsoft releases: we don't fix old features, but accrete new ones. New features help much more at review time than improvements to old ones.
(That's literally the explanation for PowerShell. Many of us wanted to improve cmd.exe, but couldn't.)
As a talented person working at a huge software company similar to Microsoft, I can relate to this.
Start-ups that used to have next to no funding in 1975 when Bill Gates inked his contract with MITS now have tens of millions in funding before they even rent out office space. These start-ups can offer 1%+ equity that is practically automatically going to be worth millions because of their funding pipeline in the web of venture capital that was created in the last 10 years in SV.
Microsoft and other IPO companies can no longer offer that type of pseudo executive compensation to even the best young programmers.
In the past this would have been some sort of risk for the person, but now with the funding structure and companies like Sequoia and Andreessen Horowitz, the equity is almost guaranteed to vest at several thousand times the value you were issued it at.
So what does that mean?
It means that the people left behind, AKA myself and others working at these huge software corporations has to manage away the problem. How do you do that? Unit testing, code coverage and really good continuous integration ( automation nets for bad programming practices ). You also need really good peer to peer code review. More importantly you need people to actually conform to the development and QA cycle. Most people after a while will get comfy and just skip various stages of the project cycle and check them off anyway. I think that happens pretty much everywhere.
Conversely a company like Facebook does not have dev branches or unit testing that you know of. The developers there are all good enough to commit directly to the main SVN trunk with no other review, and Chef pushes their changes public to all the node clusters.
But Facebook generally attracts the type of people who don't really need peer review or continuous integration layers to protect the company from their mistakes. The pay rate is several orders of magnitude higher.
I think that nature really dictates what needs to happen. The big companies need to die off, and their star dust needs to form new companies, or stars to take their place. These new stars are full of potential energy and will burn for many years to come. Rather than drag on the process to fuel the founders, we need to make a more efficient model for the end of life of companies that have completed their funding pipeline and have played out their market value. There should be some calculated threshold and guidelines that dictates when a company should die and thus we can make business development renewable in the most efficient manner rather than what exists today.