Programmers need to get work done. It's always surprising for me to see programmers make estimates for projects with tasks taking more than two days. How do you know what your progress is if you are working on something for two whole days and you could not 'nodge an item off your list'?
Keep breaking down timeframes into smaller chunks. Instead of a 12 week project, think of it as 12 weeklong projects. Instead of guesstimating at tasks that take 30+ hours, break them down into more realistic 6-10 hour chunks. Then proceed one step at a time.
That makes sense. Every programmer wants to actually have done something every day. Done, as in 'Finished'. You can only achieve that if your work-items are chopped up into very small chunks of work. I prefer 4 hours per work-item, at most. If your work-items are longer than half a day, than you probably are not sure yet what exactly must be done to finish your work. Which, in itself, does tell something… we really might not know how to finish that item off the list. We might need to investigate that some more and we might only be able to do that if any of the other work-items have been done. That is not a problem as long as we re-do the estimate every so often.
Which takes me to the "re-curring estimation sheet" which you have to reconfigure every so often. More on that later.