When you make your code more flexible or sophisticated than it needs to be, you over-engineer it. Some programmers do this because they believe they know their system’s future requirements. They reason that it’s best to make a design more flexible or sophisticated today, so it can accommodate the needs of tomorrow. That sounds reasonable – if you happen to be psychic.
Joshua Kerievsky, Refactoring to Patterns p.1
Look at the code you’ve written recently. Were you pretending you’re a psychic?