The best way to become a good programmer is to become good at debugging.
When you build complex systems, eventually you will run into bugs that are nearly impossible to reproduce. Sometimes it's not our code — the bug is baked into the dev platform we are using and there is nothing we can do about it.
Users will occasionally run into the bug ,but we won't be able to reproduce it.
So how do you fix a bug that you can't reproduce yourself?
We use an approach I call Catch and Correct. First, we identify the symptoms of the bug — as reported by our users and through our deeper investigation. Then we add code that looks for those symptoms and corrects the problem while it happens in real time. Since we can't fix the bug itself, we fix the consequences of the bug so that the user can continue playing — perhaps without even knowing that something happened.