The Curious Case of Bugs that Fix Themselves
Pawel Kadluczka
Posted on June 7, 2024
I can’t count how many times I had this conversation:
“Good news! The bug is fixed!”
“Did you fix it?”
“No.”
“Did anyone else fix it?”
“No.”
“How is it fixed then?”
“I don’t know. I could reproduce it last week, but I cannot reproduce it anymore, so it’s fixed.”
“Hmmm, can you dig a bit more to understand why it no longer reproduces?”
[Two hours later]
“I have a fix. Can you review my PR?”
Can bugs fix themselves?
I grow extremely skeptical whenever a fellow software developer tries to convince me that an issue they were assigned to fix magically fixed itself. Software defects are a result of incorrect program logic. This logic has to change for the defect to be fixed.
Can bugs disappear? Yes, they can and do disappear. But this doesn’t mean that they are fixed. Unless the root cause has been identified and addressed, the issue exists and will pop up again.
The most common reasons bugs disappear
Seeing an issue disappear might feel like a stroke of luck - no bug, no problem. But if the bug was not fixed, it is there - always lurking, ready to strike. Here are the most common reasons a bug may disappear:
Environment changes
A change in the environment no longer triggers the condition responsible for the bug. For instance, a bug that could be easily reproduced on February 29th is not reproducible on March 1st.
Configuration changes
The code path responsible for the bug may no longer be exercised after reconfiguring the application.
Data changes
Many bugs only manifest for specific data. If this data is removed, the bug disappears until the next time the same data shows up.
Unrelated code changes.
Someone modified the code, changing the condition that triggers the bug.
Concurrency (threading) bugs.
Concurrency bugs are among the hardest to crack because they can’t be reproduced consistently. Troubleshooting is difficult: even small modifications to the program (e.g., adding additional logging) can make reproducing the issue much harder, which is why concurrency bugs are a great example of Heisenbugs. And the worst part: when the fix lands, there is always the uncertainty of whether it worked because the bug could never be reproduced consistently, to begin with.
The bug was indeed fixed.
A developer touching the code fixed the bug. This fix doesn’t have to be intentional - sometimes, refactoring or implementing a feature may result in deleting or fixing the buggy code path.
The bug didn’t disappear.
The developer tasked with fixing the bug missed something or didn’t understand the bug in the first place. We’ve all been there. Dismissing a popup without reading what it says or ignoring an error message indicating a problem happens to everyone.
Fixing a bug can be easier than figuring out why it stopped manifesting. But understanding why a bug suddenly disappeared is important. It allows for re-assessing its severity and priority under new circumstances.
Conclusion
If nobody fixed it, it ain’t fixed.
💙 If you liked this article...
I publish a weekly newsletter for software engineers who want to grow their careers. I share mistakes I’ve made and lessons I’ve learned over the past 20 years as a software engineer.
Sign up here to get articles like this delivered to your inbox:
https://www.growingdev.net/
Posted on June 7, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.