Miguel de Icaza: "To sum up: (a) First dimension: things change too quickly, breaking both open source and proprietary software alike; (b) incompatibility across Linux distributions. This killed the ecosystem for third party developers trying to target Linux on the desktop. You would try once, do your best effort to support the 'top' distro or if you were feeling generous 'the top three' distros. Only to find out that your software no longer worked six months later. Supporting Linux on the desktop became a burden for independent developers." Mac OS X came along to scoop up the Linux defectors.

Someone on another article mentioned that we need a stable kernel API for drivers, so that they can write them once, and know that they will run against future kernel versions for the lifespan of their product.

I would argue that the same needs to be done for applications.

For the most part, that's already the case - for example, an app written to Gtk+ 2.0 back in 2002 will still probably compile and run on Gtk+ 2.24 today. It probably uses parts of that API which have long been deprecated, but it will still work. That's over ten years of stability.

For an actual API break, you have to go to Gtk+ 3.0, where they finally cleaned out all of those old deprecated functions. But even then, it's not a problem, because the 2.0 and 3.0 libraries have been designed to co-exist..