Well, I view it as a little different than feeling like a bad programmer. Basically-- you get to a point when you realize "The most important trick to being an amazing developer is always sincerely doubting, checking, and double-checking that fact." I feel sorry for developers who believe they're amazing without that-- they won't truly be good until that feeling dulls somewhat and they start verifying their code by habit as if they were newbie developers.
In my case, I view it more like how Socrates does: "One thing only I know, and that is that I know nothing."
Design and implement as brilliantly as one can, but then use all the tools available to protect oneself from the possible dumbass mistakes that humans inevitably make.
It's more fundamental than that - if you don't feel like a great programmer then the techniques described (static checking, unit testing, code reviews) become what you depend upon rather than just tools of your job.
For instance, code reviews are great - but maybe you can't use them in your one-person startup. That shouldn't stop you from still writing great code! It may be harder - yes, but you have to have the confidence that you can do it.
I mean consider the author's dependence on static checking. There are a lot of wonderful dynamic languages available (and a lot of great programmers in those languages too!). The author - because of his philosophy of being a "terrible programmer" is simply going to miss out on whole genres of languages and techniques.
IMHO great programmers have confidence in themselves - just as in any other field. Tools and techniques are really secondary.
In my case, I view it more like how Socrates does: "One thing only I know, and that is that I know nothing."
Design and implement as brilliantly as one can, but then use all the tools available to protect oneself from the possible dumbass mistakes that humans inevitably make.