I am not an expert at it. No, not at all.
I do the 'work break-down structure', a rough design and ask myself the question: "How many days will I take if I do this task?", for each task. Supposing I come with 'J' hours, I take it that any other random Joe will take 'J * 1.5' hours for that task. On the entire estimate, I add a 10% slack. This has worked well in most cases. In cases where the estimation was out of sync with the actual, I identify and mentally take a note on the deviation, so that I dont repeat the mistake. This is quite a PITA process BTW.
Supposing I estimate and quote 'X' hours on a project. The client almost always negotiates and eats up the 10% slack. At times, clients get back claiming that, 'X' hours is unreasonable and that it should have been 'X/5' hours. In some cases, the client genuinely does not know the work involved and is surprised that it could cost so much. In most other cases, some incompetent-nut without knowing the work involved, gives an unrealistic estimate, which the client takes for comparison.
This time, I have been thoroughly annoyed by the way I was questioned. I responded saying that, the estimate holds and that the cost just went up by 30%.