How can you be so sure you aren't underengineering, and this person you know is actually planning ahead wisely?
I've seen both in real life scenarios and usually you just throw the underegineered code away and start over with knowledge gained from the previous solution. And the reason you can do that is because you usually realize that you have an underengineered solution fairly early.
If someone wants to do something just because of a vague one-liner about "future needs" or "best practices" and when you press them on why they don't really have any coherent reasons, that's over engineering. It's typically mediocre engineers who don't really understand the concepts and are just applying a formulaic solution.