I think the key is really that pretty much every application should consist of an easy-to-read/change "policy" layer over a complex core that is less user-serviceable, but also less likely to be the area where the user needs to change something to be happy. For example, graphic designers using the GIMP should be able to change what is in what menu and toolbox to fit their work flow; they wouldn't necessarily be able to write the code for new tools, improve the image representation, or the other complicated things, but the GIMP could be a simple UI app issuing instructions to a complex engine. The answer to "The GIMP's UI doesn't work like I want" should be "Change it. If you're smart enough to use Photoshop layers, you're smart enough to rebuild the GIMP UI from pieces." (And this should, in fact, be true when someone tries.) And making GNOME 3 act like GNOME 2 (so far as the user remembers GNOME 2 and cares) should be entirely within easy-to-read/change code (for that matter, it should be possible to just run the GNOME 2 UI app against the GNOME 3-capable engine; but users should also be able to adopt GNOME 3 functionality by copy-pasting it from the official GNOME 3 UI).