Debugging Strategies That Work in Any Language

TL;DR: Most debugging sessions drag on because people start changing code before they can make the bug happen on purpose. Reproduce it first, read the error message carefully, then cut the problem in half until the cause is obvious. These debugging strategies work the same in Python, JavaScript, Java or anything else you touch.
It's 9pm. Your app worked fine on your laptop all afternoon. Now a customer says the Save button does nothing on their phone. You start editing code. Two hours later the bug is still there and you've broken the login screen.
That night was avoidable. Here's what actually works.
Mistake one: fixing before you can reproduce
If you can't make the bug happen on demand, you can't tell whether your fix worked. You're guessing, and guesses feel like progress without being progress.
So write down the exact steps that trigger it: which device, which button, which data. Try until it fails reliably. A bug that appears one time in ten is still reproducible β you just need ten tries.
The other common mistake is changing three things at once. If the bug disappears, you've no idea which change did it, or which of the other two will break something next week.
Read the error message properly
Beginners often see red text and immediately start editing. Stop. The error message usually names the problem outright β "undefined is not a function", "file not found", "index out of range".
Below it you'll often get a stack trace: a list of every function call that led to the crash. The top lines are where it broke, and the first line that mentions a file you wrote is usually the culprit. Read it slowly, top to bottom.
Then paste the exact wording into Google inside quotes. Someone has hit it before. (Add your language name, like "Python" or "TypeScript", or you'll get results for five other languages.)
Halve the problem until it's small
Here's the technique that works in every language and saves the most time: binary search. Instead of reading code line by line, cut the problem in half.
- Cut the input. Ten thousand rows crashing? Try fifty. Then five. The smallest failing example is nearly a diagnosis.
- Cut the code. Comment out half the function or skip half the steps. Does it still fail? The bug is in the other half. Repeat.
- Cut the history. If it worked last month, use
git bisectin Git. Git is the tool that saves versions of your code; bisect automatically tests older versions and tells you which change introduced the bug.
Three or four cuts usually shrink a scary bug into one obvious line.
Print the values you assume are true
Add output to your code β print() in Python, console.log() in JavaScript, System.out.println() in Java. Print the variable just before the crash. Nine times out of ten, the bug sits exactly where your assumption was wrong: the list was empty, the ID was a number instead of text, the date was null.
Most editors also offer breakpoints. Think of a breakpoint as a pause button on your code: it freezes the program mid-run so you can inspect every value.
And try rubber duck debugging: explain your code out loud, line by line, to a colleague or a plastic duck. Saying it aloud forces you to check each step, and you'll often hear your own mistake halfway through a sentence.
What this means for you
Next time something breaks, run this list before you edit anything:
- Write the steps that trigger the bug, and confirm they fail every time.
- Read the error message and stack trace fully, then search the exact text.
- Change one thing, test, and undo it if it didn't help. Keep a short note of what you tried.
- Shrink the input and the code until the cause is tiny.
- After the fix, add a test that fails without your change. That bug never comes back quietly.
Key Takeaways
- Reproduce the bug on purpose before you touch any code.
- Read the whole error message; it usually names the problem.
- Change one thing at a time so you know what fixed it.
- Cut the problem in half repeatedly until the cause is obvious.
Frequently Asked Questions
How do I debug code when there's no error message?
Print or log the values at each step and compare them with what you expected. The first value that's wrong is your bug. Silent bugs are almost always wrong data, not wrong logic.
What's the fastest way to find which change broke things?
Use git bisect if your code is in Git. It tests older versions automatically and points at the exact change that broke it, usually in a few minutes.
Is rubber duck debugging real or just a joke?
It's real. Explaining your code out loud makes you check details you'd otherwise skip, and that's where most bugs hide. A colleague who knows nothing about programming works fine too.
How did this story feel?
Be the first to react
Recommended gear
Popular tech picks
Samsung Galaxy S25 Ultra
6.9" AMOLED Β· 200MP Β· 5000mAh
Editor's pickView on Amazon βApple MacBook Air 13-inch (M4)
M4 Β· 16GB Β· 13.6" Liquid Retina
Editor's pickView on Amazon βSony WH-1000XM5
Over-ear ANC Β· 30h battery
Best headphonesView on Amazon βAffiliate links: we may earn a commission at no extra cost to you.
Weekly tech brief
The tech stories worth your time, every Sunday.
One short email with the most useful guides and gadget picks from the week. No spam, unsubscribe anytime.
Written by
TechPulse TeamThe TechPulse editorial team publishes clear, practical technology guides. Every article is original and written to be understood β not just skimmed. Read our editorial policy.
Comments (0)
No comments yet β start the conversation!
Keep reading

Time Complexity Explained (Without the CS Degree)
Why does an app fly with 50 photos but crawl with 5,000? Time complexity explained without the math β and what it means for the apps you use daily.

Git Commands for Beginners: The 7 You Need First
You don't need every Git command. Learn the seven beginner commands that save your work, keep your team in sync, and help you undo small mistakes.

API Design: Habits That Age Well
Good API design is like a well-planned menu. Learn the habits that keep your software stable and reliable for years, explained with simple everyday examples.