I Am a Terrible Programmer

I write code that does not work on the first try. I forget syntax for things I have done a hundred times. I make architectural decisions that I regret six months later. I read code I wrote last year and wonder who let that person near a keyboard.

I am a terrible programmer. And if you write code, you probably are too — at least by your own assessment.

The Taste Gap

Ira Glass described the “taste gap” in creative work: when you are new to a craft, your taste (your ability to recognize quality) develops faster than your skill (your ability to produce quality). You can see what good code looks like before you can write it. The gap between what you recognize as good and what you can produce feels like incompetence.

This gap never fully closes. As your skills improve, your taste improves too. You recognize subtler problems, deeper design flaws, more elegant solutions — and you see them in your own work. The feeling of being terrible persists because the standard you are measuring against keeps rising.

What Terrible Actually Means

If you are worried about being a terrible programmer, you are probably not one. Genuinely incompetent programmers do not worry about their competence. They are confident in code that does not work, defensive about decisions that are wrong, and uninterested in improving.

The programmer who feels terrible is the one who sees the gap, who notices that their code could be better, who is aware of what they do not know. This awareness — the source of the feeling — is exactly the quality that drives improvement.

The Comparison Trap

You compare your internal experience (confusion, doubt, struggle) to other people’s external output (finished products, clean repos, conference talks). This comparison is unfair because you are comparing your process to their result. You do not see their confusion, their abandoned attempts, their 3 AM debugging sessions.

Every programmer you admire has written terrible code. Every clean codebase you have seen is the product of multiple revisions, code reviews, and refactoring sessions. The finished product hides the mess that produced it.

Living With It

You do not overcome the feeling of being a terrible programmer. You learn to coexist with it. You learn that the feeling is information (“there is a gap between where I am and where I want to be”) rather than a verdict (“I am not good enough”). You learn that the gap is permanent and that closing it incrementally is the work.

Every programmer is terrible. The good ones know it and keep writing code anyway.