Developing software can lead you to think in a binary way—things are either on or off; they work or don’t work; something is either true or false. However, the real world is far from binary; it is a sea of variety. The software you create for yourself, and others, lives in that world.
The real world is not black or white; it is an infinitely variable field stretching between those two extremes. Computer systems that run software lose power and fail. The networks connecting systems are slow, intermittent, or unreliable. The storage systems on which software depends to save information become full, unreliable, or fail. The users of your software make incorrect assumptions and enter wrong or misleading data.
In addition to the problematic world in which software runs, you will create bugs in the code you write. Software bugs are errors or failures, causing an application to produce unexpected results. Most software applications providing something useful are complex enough that bugs will creep in. These come from wrong assumptions on the part of the developer, oversights, and simple everyday mistakes.