Software engineers during the early stages of their careers have a tendency to think that building software successfully means getting things right during the initial stages. I was that guy too. Over the years, I’ve learned that this is almost never the case. I can’t just say that it’s never the case ’cause there might be times where this is crucial, especially when implementing anything around user privacy, payments, handling sensitive information, etc. For the remainder, the key to succeed at building good software lies in its ability to change.
You almost never get things right in the initial try. The initial try is usually accompanied by multiple iterations based on one of the most valuable things – user feedback. As you capture user feedback, you build a spec that essentially ends up being version 2.0 of your original software.
This is not only true for products, but also software in general. These will help you build good software that your users like and appreciate.