I've heard plenty of warnings against premature optimization over the years but I've found that premature generalization is far more insidious. I still get caught off guard occasionally going too far down the path of the latter.
I like "abstractable" code. Write as concrete as possible, but provide comments in the code about how it would be possible to abstract. This tends to clean the design without paying the premium of actually implementing and testing the abstraction. Abstract abstractions?