Unless you’re doing the same task over and over, estimating accurately is difficult, because almost always the successful developer will be optimistic and vastly underestimate the complexity of the problem domain. I think a more important skill is being able to separate requirements into subproblems that are well understood and unknowns… and then going deep into hashing out those unknowns and try to either turn them into 'knowns' or gauging the risk that they bring to the estimate (a.k.a., how long do you think the problem can tskr, if worst comes to worst).