I have to be good at finding and fixing bugs when I program like I do. ;)
First of all, I have to admit that the bug is mine. When working with a group it is easy to blame someone else for a problem. When I get that inclination, I start by collecting enough evidence to prove that the bug is theirs. About half the time, I collect enough evidence to determine that it is mine. By that time I'm well on my way to a solution. Otherwise I approach the other developer explaining what my code does, what the response is, and what surprises me about that response. That makes it easier for them to either point out where my expectations were wrong or where their contributions may not be working correctly.
When I do determine that the problem is mine, I approach it with "the relentless application of logic." I collect all of the information I can about the misbehavior. Then I examine it and the code side by side, trying to figure out what could cause unexpected behavior. Usually this points to some part of the code that becomes suspect. At that point I try to instrument the code further, saving copies of variables or logging critical information. Based on the further information collected, I evaluate and refine my original hypothesis and go on. Several such iterations usually nail down the bug or point to a new area for investigation. I guess that boils down to analyze -> instrument -> test -> repeat. When I find the problem, I always go through at least one more instrument -> test iteration to make sure the bug really is fixed.
As others have mentioned, ask coworkers for help. That helps in two ways. First, you will understand your code better when explaining it to them. Even if your coworkers are not at your level, this can help. Second, they may see things you did not notice or ask questions that did not occur.