The first thing you can do when building software is defining who the software is for and why they’re using the software.
And please don’t say “My software is for everyone.” It’s not. I mean, you can make that an explicit goal, and suffer the consequences of that approach, but for the sake of your livelihood, please don’t. I actually can’t think of a single piece of software I’ve ever used that it’s for everyone. Don’t believe me? Even as broad as Operating Systems can’t be for everyone. As a case-in-point; iOS 13+ requires some sort of passcode to access the device. It’s important to note that even 5 years ago, passcodes weren’t ‘required’. There are entire generations of people who have never had a passcode, and at their age these days, are probably too advanced to remember what their passcode is. This happened to a friend of mine just last week. Their mother had been given an iPhone and had to set a passcode, and subsequently forgot that passcode. Their only option was to have the phone reset, losing everything on it.
It’s very clear that even for something as ubiquitous as a smartphone, it’s not for everyone, and we do a disservice to our users when we think it is.
Choosing who you are serving with your software allows you to set the appropriate expectations for what it will and won’t do, and allows you and your team to focus on making it the best possible experience for the people you’re trying to serve. Making software that tries to serve everyone makes software that is just frustrating enough for anyone, and is truly exceptional for no one.