One thing I've found that works for me: stop designing before you've worked out every detail. Leave some design issues unsolved. Just get to where you believe you'll be able to solve them as you code.
That way, when you're coding your brain still has something interesting to chew on… and I find it keeps me from going too far off the over-engineering deep end.
That way, when you're coding your brain still has something interesting to chew on… and I find it keeps me from going too far off the over-engineering deep end.