That’s tricky question. Every ambitious software engineer will see more and more things, which need to be done in the software to make it better. That’s game could finish never, and that’s the point.
Finding the difference between good enough version of our product and the ‘final’ version is crucial. The advantage of software is (in comparison to e.g. building projects) that delivery of fixed version, replicating, copying the version, reusing things, replacing part of them is relatively cheap. That’s right, you don’t need huge amount of the effort to change it (in comparison to change already built skyscraper), of course there are exceptions to that but let me assume general cases.
There is another interesting thing which is good to have it in the mind. Software lives. With next iterations, versions of it the new features, bug fixes and other things appear. With the time, software become more mature, more stable (should be;), so the question about how to identify good enough software appear.
The useful one. That’s it. If you know, that your product is the added value for recipients, then it means they will want to use it. That simple fact describes one meaningful thing, which is making our industry much differ from others like architecture. We could use things to achieve value relatively fast and we could do cheaper improvements to that.