This is the biggest issue that I encounter:
> We run in to a complicated bug associated with what we're trying to do - so then we have to deal with the bug to get it done
Very often the "little tweak" executes a line of code that has always had a bug (AKA "Tech Debt"), but was never found, as there was no code path.
That's why code coverage tools are important (but they tend to be hard to find).
A lot of what I write are reusable tools, SDKs and APIs. I tend to write a lot of code paths that will only be of interest to certain clients. It's incumbent upon me to test them all, but I often miss one or two.