Programming is and isn't necessary to be a successful tester, but what is needed is a way to really get your mind around how the system works. For some, programming helps with that, for others, models, state transition diagrams, or a simple developer explanation of the architecture is sufficient. Let us also be clear, in saying, that knowing how to understand code, to read it, if you will, is a far cry from being able to code it, and to do so well.
I've met some top notch testers who would never be confused with a programmer, but they could get to know the system and all its quirks and business rules better than some of the devs on the project. I've always respected people like that.
So when an earlier comment says, we just fired all the bad testers and we had improvement, this actually doesn't surprise me. This is knowledge work, and that requires sapience and critical thinking a skill that both devs and testers need in good measure.