There's an old saying that you should "write a solution from scratch once, copy/paste it the second time, and refactor it to be generic the third time". While not hard-and-fast rule, I do find it a useful guideline.
TL;DR: I always try and create generic systems in game, as a result things take longer than if it was a Specific implementation. How do you decide if something should be generic or specific.
Make yourself always write the specific implementation the first time. When you realise you need the same functionality in another location, it's pretty likely that you now have a better idea of the problem constraints than if you'd have tried to make it generic right off the bat.
I think the other half of the issue is the mentality of trying to code something to cater for all possible future use-cases which is impossible. If you know of a future use-case then it just becomes a current use-case but one can waste alot of time trying to allow for them.