To advocate for the devil: how many useless (or at least unused) abstractions has this produced in your code?  How many interfaces have only a single subtype (or turn out not to need runtime virtualization at all)?  How many dead/untested accessor methods are there?  How many declared methods went unimplemented because they weren't called?  How many "plugin" interfaces have you written for software that doesn't need runtime plugins?<p>It's been my experience that "future proof" code tends to be filled with this stuff, and that the cost of all this chaff is vastly higher than the authors think it is when they write it.