When asking software engineers for an estimate of the time required to build something, I often find them guessing the time taken instead of doing the work to estimate it. Yes, estimates come with their own caveats but, like planning, if you don’t estimate well, you may not have an idea of what you’re actually dealing with.
Here is something that I did with my kid yesterday that illustrates the difference between estimation and guessing.
We had a family event last evening at which my kids picked up a couple of helium filled balloons and brought them home. As they were playing with it, I told my older son that if he got enough number of balloons, they can carry him up. As kids go, he added another pair of balloons and wondered why they weren’t carrying him.
So we had to find out how many balloons it would take to lift his entire weight. It wasn’t enough to say “thousands of balloons”. That would be guessing. It could be 1000 or it could be 1000000. How do we then estimate how many balloons it would take to lift my son.
Estimation is about making use of what you already know reasonably well in order to calculate something that you didn’t know about before.
What did we know in this case? My son weighs about 25kg. If we knew how much weight each balloon could lift, then we can divide his weight by the weight each balloon could lift and get an idea of the number of balloons needed.
How do we measure the weight each balloon can lift? For sure, it is a small number. I don’t have small known weights just lying around the house waiting to be used in such a quest … maybe I should, but that’s beside the point.
What known small weight did I have? One of my notebooks has 80gsm paper. That’s 80 grams per square metre. That’s something we could use.
I tore up a sheet of this paper and tied it to a pair of balloons (they were already paired up). The balloons sank. So we knew that without the paper, the balloons rise and with the sheet, the balloons sink. So the weight they carry must be smaller than the weight of the sheet of paper, which is much smaller than any of our own body weights.
So we snipped away at the paper until the balloons and the paper balanced each other precisely. This was fun in itself - both the snipping process, and just the end result of a balloon just hovering in mid air - neither rising up nor falling down. The kids were amused by just that much. We could’ve done this mentally, but it is much more fun to actually do it … and with kids.
We then measured with a ruler the area of the paper that the balloon’s pull balanced exactly. This turned out to be 159.6 sqcm - which we took to be 160 sqcm approximately.
The paper therefore weighed 80 x 160 / 100000 grams = 1.28 grams. Well, that’s its mass, but we ignore the conceptual difference between mass and weight. I’m dealing with kids here. Awesome, we’re almost there. So each balloon (we had a pair, remember) could lift 0.64 grams of weight.
How many balloons would it take to lift 25000 grams? To calculate this mentally, I approximated my son’s weight to 25.6kgs, to get 25600 / 0.64 balloons = 40000 balloons. It’s worth overestimating his weight a bit to ensure that he’ll definitely be lifted by the number of balloons we’re estimating it’ll take … not that I’m actually going to buy that many balloons any time soon.
“This is great.”, I thought. “Now my son has an idea of how many balloons to buy in order to float away from his dad who’d talk fractions to him at 9pm instead of reading him a story.”
Back to estimating vs guessing
Estimating is a creative act. While it may be possible to guess fairly accurately after long experience in an area, the effort to estimate well goes a long way to build understanding of a space. If you do provide an estimate, it would then demonstrate how well you understand the task at hand.
While “thousands of balloons” turned out to not be a bad guess, it is imprecise and the answer wouldn’t have varied much had the balloon been a different one. The estimate, on the other hand, is relatively precise in stating “about 40000 of these particular balloons inside this particular house”.
Also, when a guesser is asked why they came up with the number, no explanation can be offered. With estimates, it is possible to critically probe further to gain some insight into the problem at hand. For example, we can now ask “if we replaced helium with hydrogen and the same balloons were filled to the same volume, would it require different number of balloons?”
Some characteristics of estimates
Model: In order to estimate anything, you need to have a model that captures your understanding of the system whose property you’re estimating. In the case of the balloons, we had to have a minimal grasp of how balloons are lighter than air and we could treat the helium-balloon vs paper like a see-saw balance to determine the “upward weight” of the balloon. Not a complicated model, but a model nonetheless.
Precision: is a characteristic of a good estimate. By precision, I’m not referring to number of decimal places you give in your final number, though that is one aspect, but in the factors that you’ve accounted for in your calculation. This precision is a consequence of having a model. It may be so that many of your model’s parameters are redundant in the estimate, but the point is that that redundancy is made explicit. For example, in this balloon case, the acceleration due to gravity is a model parameter that is redundant. The estimation process should always yield a precision value that indicates how well we can pin point the value. In our case, it could be stated as “40000 balloons give or take about 2000” because that’s the precision with which I knew my son’s weight, which was a parameter in the model.
Measurement: Given a model, usually there is some unknown about the current circumstance that needs to be found out before the model can be used to calculate the number(s) we need to know. So typically estimates entail measurement of some unknown. The measurement could serve to either find out something we didn’t know earlier, or to improve the precision of some already known thing given the context. We may also be able to use measurements that were already made by others.
Prediction: A good estimate exposes the model in a way that can be used to answer other questions. For example, in the balloon case, we could now ask how many balloons would it take to lift me, or how much space would it take to house all these balloons. The result can then be plugged into other models. In doing so, however, we need to be aware of how we’re propagating errors in the process.
Balance of errors: While estimating, it is good to show some care towards the balance of errors. Sometimes, overestimation is desirable to underestimation, and sometimes the other way around. Sometimes errors cancel out to give a surprisingly accurate result (in hindsight) … but we should’nt rely on that happening and truly understand the errors that might be involved.
The physicist Enrico Fermi was such a master of the art of estimation that the problem of estimating in a “back of the envelope calculation” kind of way is called a Fermi problem.
In our case, had we assumed that the balloon will hold up the entire sheet of paper, we could’ve come up with an answer that is at the right order of magnitude, perhaps in the 20000 balloons range. However, in this case, we’re not generally good with estimating small-in-our-experience numbers as well as large-in-our-experience numbers. Both “microgram” and “kiloton” would take some imagination before we can relate to them. So it is a good habit to realize this deficiency, shut up and measure .. when we can. However, even a 50% error is not bad as it is in the right order of magnitude which suffices for many purposes. Also, we know all the parameters invoved in our model the other aspects listed above continue to apply. If you need more precision in the result, you know where to go and improve the precision.
The next time you’re asked for an estimate, do not guess.