@b0rk Reducing side-effects, complexity of interfaces between components, and multi-threaded components will reduce the odds of those issues and make them easier to debug.
If you don't have side-effects, and you're using RNG to test possible inputs, you can test *every* input from a single state, before advancing to the next one using a random input.
If your environment supports it, async/await helps a lot with building single-threaded code when you might otherwise need multiple threads.