Objects in a program should be replaceable with instances of their sub-types without altering the correctness of that program
Robert C. Martin
“At the beginning, keep things simple and concrete – stick to that as long as possible/necessary.”
“Correct abstractions usually come after careful thinking and initial minimal, concrete implementation”
“Incorrect abstractions usually come from wrong presumptions and over-engineered ideas”