In my case, it's very much a "gut feeling," but I work on my own stuff.
I like to stay at a 1-digit bug count, with that digit being "0," if at all possible.
I have a development technique that is afforded by the tools I use, and the platform. I call it "Constant Beta." I also do what I call "Evolutionary Design," where I refine the actual project plan and design, as I proceed.
Basically, I keep the app at ship quality, from the very beginning. If I encounter bugs -any bugs- at any time during development, I stop all forward development, until the bug has been fixed.
I test a lot. I tend to use test harnesses, or the integrated app, as opposed to unit tests. Unit tests are applied, once functionality has been established; and only for those parts of the system that makes sense. I like to break projects out, into standalone packages, with discrete lifecycles. I often publish these, as open source.
I like to do full integration testing, as soon as possible. Almost all of my testing is done on the whole system (which might be incomplete, with stubs and mocks).
"Constant Beta" means that I start releasing TestFlight beta to my team, as soon as possible. As an example, I have been working on the project that is my current obsession, since September 5th, of 2020 (first commit). I have been making TestFlight releases, since October 6th, 2020. I've made well over 500 TestFlight releases, in that time. I'll have to count the tags, but it may be over 600, by now.
If you know anything about TestFlight, you know that Apple vets the releases (but not as stringently as for release into the App Store). They won't approve a TestFlight release, unless the app is already quite substantial, and doesn't crash. In fact, in one release, Apple helped me to spot a bug, because they made it crash in a way that had escaped my testing, and rejected the build.
I can scare up a full-fledged, "shippable" app, in a few days. All the time since, has been spent adding functionality to the app, testing, refining, testing, pivoting, testing, refactoring, testing, removing functionality, testing, going back to the drawing board, testing, etc.
All the while, keeping a cadence of multiple releases per day (once the first release has been made of a version, builds are approved almost immediately).
Tends to keep the quality high.