Good procedures should make it possible for a developer to mostly test his own code. But you could spend days figuring out every possible date format and develop a way to test for it, and you wouldn't think someone would enter "the day after Bob's birthday" for the delivery date.
The point about familiarity is also very true. We just hired two QA people at my soon-to-be-former job. After I reviewed a new spec, I would submit it to them. I knew that, having been to so many of the planning meetings, I knew what they really meant. I needed a second set of eyes to tell me if that's what they really said.