- inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn't very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app.
I think this is a valid point. Trying to reuse bits of code from a project that has been extensively designed around an object hierarchy is a pain and requires tearing things apart and a lot of recoding. Some code isn't meant to be reused outside of the original project, desktops may be an instance of this. But suites of algorithms should be designed so that the individual parts are easily separated from the whole.