Great article, but you missed the number one cause of bad estimates: management.
I have been programming for almost 50 years now, and my estimates have gotten better, but in many organizations I have two sets of estimates - my private estimate, and the one I am allowed to give.
I had an argument with a boss, a famous sociopath named Vinnie Falco, that typified this. I told him that if these were real estimates, then about half the time they would be too big, which is simply logical.
He said something to the effect of, "If you ever made an estimate that was too long, you wouldn't be working here very long either."
it was a game changer for me. I realized that management often wanted us to make low-ball estimates, so they in turn could lie to upper management and clients.
My current company is significantly more enlightened.