I used to do this to random things I had on my desk, then a rubber duck (that I lost...), and eventually My Little Pony toys - http://pic.twitter.com/sijtDFZh ...turns out that doing a question/reply in my head with a MLP toy with their respective in-show personalities would sometimes help me figure things out.
My version's far more embarrassing. I go to a real life colleague of mine because I couldn't figure it out for the life of me, and as I explain it to them, I come to the answer myself in the middle of explaining it to them.
So I succeed in wasting my colleagues time and making myself look like an idiot.
If you try to explain the problem to your colleague in an e-mail instead of in person, you can avoid sending the e-mail if the answer comes to you in mid-explanation. I can't even count how many bugs I've solved this way.
Except a real person can ask questions, even naive ones, and still guide your mind towards the solution. The process is incredibly close to maieutics, with the "duck" playing Socrates.
No. Greenyoda is talking about the process where writing down just the initial description of the problem is sufficient to notice the solution. Happens to me all the time, and I also observe it happen to others. My more junior coworkers sometimes sent me IMs like this:
Coworker:
Hey enraged_camel, I'm having an issue, I was wondering if you can help
It goes like this
<description of the issue, followed by a 10-15 second pause>
Actually I think I figured it out...
Sometimes I read their problem description and don't respond for several minutes to allow them to have that internal conversation with themselves. And a lot of the time, it works.
This is called, in my experience, "throwing it against a backboard" (ie, basketball reference). It's incredibly useful - not everyone can explain things to a rubber duck but can usually explain a problem to a real person.
Plus you get some more human interaction - which as a programmer, you probably need more than you are allowing yourself (or your coworker is).
Some breeds of dogs are very good listeners. I've heard of libraries where they occasionally have a dog around for children to read to: it apparently is a good experience to learn to read by reading out loud to a patient listener.
I've wanted to have a code dog for a long time. I'd invite the bug hound over and explain my code to it.
I tend to do the same thing when I peel away from the screen and take a shower to think on a problem. Maybe instead of keeping it all in my head a rubber duck would be more efficient...
A rubber duck HAL-bot would be cool, it would answer with some programming related jibberish from previous questions. You could even feed it some CS literature!
But I recently adopted a cat, and now my cat is who I talk to when I need to talk a problem over :D http://www.flickr.com/photos/chix0r/8419684010