Striking a balance between shipping and perfecting has always been a struggle for me. The only thing that helped me get a handle on it was writing alot of code. Eventually, I gained a bit of intuition about what to skimp on, so I can usually do things fast while still delivering something that will not need to be thrown out in the immediate future. Mostly this amounts to coding things in a simple, straightforward manner and applying abstraction only when it's really necessary.