I've found that larger projects typically need to meet somewhere in the middle. It doesn't make sense to sweat every detail but making a poor design choice in the wrong area can come back to bite you.
In my experience it really pays off to hit the whiteboard before coding up objects, algorithms, templates, etc because once other sections of code are relying on them they aren't easy to modify; if you think through their use cases ahead of time, you can often build them with complete functionality. This is a good place for perfectionism.
On the other hand, when making drivers, interfaces, derived classes, and similar things, you won't do yourself any favors by being meticulous. You'll probably be refactoring it in the future if it's important and if it isn't nothing really suffers. Decide what you think is reasonable and do that.