Nothing is ever perfect.
There's always one improvement you can make. That one method can be refactored. Extra comments can be added. There's one edge case that shouldn't logically occur, but hypothetically could.
Depending on what your target audience is for whatever you create, there are levels of imperfectness that are tolerated. It's important to understand where your creation lies. Detailed calculations to land a probe on Mars? There's no room for failure. A utility that will run once then will be thrown away? Cutting corners might not be such a big deal. Customer-facing application that will make their lives easier? Probably sits somewhere in the middle.
If you don't know what the finish line looks like, you'll never finish. Define your finish line.