‹ All Posts

Rubber Duck Debugging Out Loud, With a Duck That Remembers

September 24, 2026 • 8 minute read

SamiSami
Rubber Duck Debugging Out Loud, With a Duck That Remembers

Rubber duck debugging means explaining your code, line by line, out loud, usually to a literal rubber duck, until you hear the bug in your own explanation. It works because speaking forces you out of "scanning" mode and into "explaining" mode, which exposes the gap between what you think the code does and what it actually does. Its one weakness is that the duck forgets everything. Record the session instead, and the explanation you worked so hard to produce becomes a debugging log you can search, reuse for a postmortem, or hand to a teammate. Flint turns that recording into a clean note in one press.

Every developer has had the moment. You walk over to a colleague, start explaining the bug, get two sentences in, and stop. "Oh. Never mind." The colleague didn't do anything. The act of explaining did. Rubber duck debugging is just that moment on purpose, without needing to interrupt anyone.

What Rubber Duck Debugging Is

The name comes from The Pragmatic Programmer (1999) by Andrew Hunt and David Thomas, which describes a programmer who carried a rubber duck and debugged by explaining code to it line by line. The idea is older than the book. Mathematicians have long known that explaining a proof reveals gaps you can't see by reading alone.

The method is almost embarrassingly simple. Start with what the code is supposed to do in one sentence. Then walk through it line by line, out loud, saying what each variable holds, what each condition checks, and what happens when each loop finishes. Don't skip lines, because the bugs live in the lines you want to skip. The moment you hesitate, backtrack, or say "wait, actually" is usually the moment you've found it.

Why It Actually Works

It sounds too simple to work. The reason it does is well documented in cognitive psychology, under a name you can look up: the self-explanation effect.

When you silently read code you wrote, your brain runs in recognition mode. It scans for patterns and fills in what it expects to see, which is exactly why you read straight past your own bug ten times. Explaining out loud switches you into generation mode, where you build the explanation from scratch. Anything you can't explain cleanly stands out immediately.

Speaking also forces you to slow down and articulate details you normally compress. You can't say "and then it does the thing" to a duck. You have to say which thing, with which value, under which condition. That precision is where hidden assumptions, missing context, and logical gaps show up.

The same trick works beyond bugs. Explaining requirements, a system flow, or a deployment plan out loud surfaces ambiguities before they cost you a day. If you can't state what a design does in plain words, the design isn't finished yet.

The Problem: The Duck Forgets Everything

Here is what rubber duck articles never mention. The explanation you produce while debugging is valuable, not just the fix.

In the ten minutes before the "aha", you usually rule out three wrong theories, confirm what the system actually does in an edge case, and discover something about the codebase that nobody wrote down. Then you fix the bug, commit, and move on. All of that reasoning evaporates. The next person to hit a similar bug, often you in six months, starts from zero.

Sometimes the duck doesn't crack it at all. The bug survives until tomorrow, or it gets handed to a teammate. Now the thing you most need is a record of what you already tried and what you already ruled out, and there isn't one, because you said it to a toy.

A clear explanation of your code is also useful for future reference and for onboarding, which is one of the underrated side effects of the method. It's just that nobody keeps it.

Record the Duck Session

The fix is to record the explanation instead of saying it into the void. Nothing about the technique changes. You still talk it through line by line, out loud. You just end up with something afterward.

That recording then becomes one of three things. If you found the bug, it's a short debugging log: the symptom, what you ruled out, the cause, and the fix, which is exactly what you'd want for a postmortem, a PR description, or a commit message that explains why. If you didn't, it's a handoff note: everything you tried and why it didn't work, so tomorrow-you or a teammate doesn't repeat it. And over time, a pile of these becomes a searchable history of how your system actually behaves, written in plain language, which is far more useful than most internal docs.

How to Run a Recorded Duck Session

Keep the classic method and add two bookends.

Open with the symptom and the expectation. Before touching the code, say what should happen, what actually happens, and how you reproduced it. This alone often solves it.

Walk the code out loud. Line by line, no skipping. Say values, not vibes. When you catch yourself saying "and obviously," stop, because that's usually the assumption that's wrong.

Close with a status line. Say one of two things: "found it, the cause was X and the fix is Y," or "not solved, I've ruled out A, B, and C, and my next guess is D." That last sentence is what turns a ramble into a useful record.

Keep sessions short, five to ten minutes. If you're still stuck after that, the problem probably needs a different approach, not a longer explanation.

How to Do It With Flint

Flint is a simple way to give the duck a memory. Press record, and on iPhone you can start from the Action Button or Lock Screen widget without unlocking. Then talk through the bug exactly as you would to a duck. When you stop, Flint turns the ramble into a clean, structured note instead of a raw transcript. You can set a custom format with sections for symptom, what I tried, cause, and fix, so every debugging session comes back in the same shape. If you need a different angle, add an instruction like "turn this into a PR description" and regenerate.

Because every session is transcribed and kept in one place, you can later search by what you said or ask across your notes, for example "have I hit a race condition in the sync worker before?", and get your own past reasoning back. The original audio stays attached, so you can replay the exact explanation. It's local-first, so recordings stay on your device, and it costs a one-time $12 with a free tier to try.

If you already use voice for other parts of your work, this fits the same habit. Our guide to writing specs for Claude Code by talking uses the same move before the code exists rather than after it breaks.

When This Doesn't Fit

Recording adds nothing if the bug is trivial and you'll never care about it again. Just fix it. It's also awkward in an open-plan office. Talking to your phone about a null pointer draws looks, so a quieter spot or earbuds with a mic helps.

Flint doesn't read your code, attach to a debugger, or connect to your repo, issue tracker, or IDE. It captures your spoken reasoning, and you paste the note wherever it needs to go. It's local-first rather than fully offline, since some AI processing happens in the cloud, so don't read out secrets, credentials, or customer data, and check your company's policy if you work on sensitive systems.

And a recorded duck is not a replacement for a real colleague when you're truly stuck. The duck that talks back, another developer asking "why do you think that?", still wins on hard problems. The recording just makes that conversation faster, because you can share exactly what you've already tried.

Flint is available on the App Store and on Google Play.

Frequently Asked Questions

What is rubber duck debugging? A technique where you explain your code line by line, out loud, to an inanimate object such as a rubber duck. Articulating each step exposes the mismatch between what you think the code does and what it actually does. The term comes from The Pragmatic Programmer.

Why does explaining code out loud help find bugs? Because of the self-explanation effect. Silently reading code keeps you in recognition mode, where your brain fills in what it expects. Explaining out loud forces you to generate the logic from scratch, which makes gaps and wrong assumptions obvious.

Do I need an actual rubber duck? No. Any listener works, including a colleague, a pet, or nobody at all. The benefit comes from speaking the explanation, not from the duck.

Why record a rubber duck session? Because the reasoning you produce, the theories you ruled out and what you learned about the system, is useful after the fix. A recording becomes a debugging log for postmortems and PR descriptions, or a handoff note if the bug isn't solved yet.

Does rubber duck debugging work for more than bugs? Yes. Explaining requirements, system flows, and designs out loud surfaces ambiguities and missing context the same way. If you can't explain a design plainly, it usually isn't finished.

Can I use AI as the duck? You can paste code into an AI assistant and ask it to explain what the code does, then compare that with your intent. That's a useful variation. Explaining it yourself first is still the fastest way to find your own wrong assumption.

The duck helps you find the bug. It just can't remember how you did it. With Flint, talk through the bug in one press and get back a clean debugging log you can search, reuse, or hand off. One-time $12, free to try. Download Flint on the App Store or Google Play.