Don’t focus on perfection and purity of solution, especially if the bounds of the problem aren’t well known. Launch and iterate. Any sufficiently complex software engineering effort is bound to encounter uncertainty as to how a component should be designed or how a problem should be tackled.