As the saying goes "Assumptions are the mother of all ^*&#-ups".
The difficulty, at least in building software, is that the specific assumptions we may have differ from project to project. These assumptions are often difficult to spot ahead of time. Many may be cut from similar cloth, but one tends to discover that assumptions get dressed up in different disguises. Almost inevitably, it is our assumptions gone wrong that takes us most by surpise and leave us feeling most confounded since they seem so obvious in hindsight.
So what can we do to spot those deviously disguised assumptions and prevent their antics?
Make a note of this.
Write the reasons down.
For each of those expectations you have, consider that they are actually assumptions. Now take another look at that list. Suddenly you start to realise how easy it is to be lead astray by assumptions.
Now, ask and answer the following questions:
What would cause X, Y and Z not to happen?
Based on those answers, then ask what can be done in order to:
a. Avoid each one of these happening at all?
b. If we cannot avoid it, what can be done to mitigate the chance of it happening?
c. If it can't be mitigated, what can be done to recover from, or reduce the impact of, it happening?
Do those things.
While it can be difficult to see our blindspots and assumptions at all times, I do believe that by asking these questions, we can at least begin to better indentify the assumptions, that while obvious in hindsight, often sneak up on us unawares and catch us napping.