🤔 But how? I think it comes down to confidence.
Confidence to not break your codebase. Confidence to get informed when it does happen. And confidence to then fix it.
Some ideas to increase your shipping confidence:
If you need to manually test every feature of your product every time you make a change, you're going to be reluctant making incremental changes.
You're going to favor larger increments which require fewer test rounds, but are more likely to break and harder to fix
Code linters help you prevent (stupid) mistakes and eliminate irrelevant considerations ("how should I structure this code block?")
Pro tip: when you start using a linter, whitelist any existing violations. Fix them over time. Iteratively.
A tool like Git not only makes it easier to collaborate with other developers, but also is a great way to document your incremental codebase changes.
When using error reporting tools you can even see which code changes introduced (or fixed) the error.
Make regular, automated backups of your data, codebase, app configuration, and anything else you might lose when catastrophe strikes.
If it's not automated, you'll forget. Automate it and test them to see they actually work correctly.
Can you quickly rollback your code? If you're using Git (e.g. on @Heroku), then you can probably rollback your code changes quite easily.
Just be cautious rolling back code that affects your database structure, background jobs, etc.
Talking about rollbacks, can you easily rollback your database schema when necessary? Do you have version control for your schema?
Something like @rails database migrations are super helpful for this. I'm sure they exist for other frameworks too.
When making crucial changes, it helps reviewing them in a different context. Just like you might not spot a typo until after you print the document, the same is true for code.
Reviewing your code e.g. in your browser (@GitHub) can help you spot issues.
If something did break in your code, you want to get informed as quick as possible. Tool like @uptimerobot and @hyperping alert you when your site is down/slow.
@bugsnag informs you of specific errors along with the stack trace, browser info, etc.
Some problems might not cause concrete errors. Slow loading, time outs, etc. Make sure you keep track of your app analytics. Ideally you'd set up alerts so you don't need to actively monitor everything.
If all fails, your customers will hopefully let you know when there's a problem. So make sure they can easily reach you.
Don't use no-reply@ email addresses. Prominently display your support email. Self-hosted contact forms could break too btw 😉
When shit hits the fan, it's super helpful if you've got a bunch of specialists around you. Whether it's a devops issue, front-end, API integration, etc. Having other experienced makers around you is priceless*