Introduction
Writing code is not easy. Actually, it is very hard. Even the best programmer in the world can't foresee every possible alternative and flow of the code.
This means that executing our code will always produce surprises and unexpected behaviors. Some will be very evident, while others will be very subtle, but the ability to identify and remove these defects in the code is critical to building solid software.
These defects in software are known as bugs, and therefore removing them is called debugging.
Inspecting the code just by reading it and reasoning about its execution image will never be enough to cover all the possible outcomes on non-trivial code. There are always surprises, and complex code is difficult to follow. That's why the ability to debug by stopping execution and taking a look at the current state of things is important.
Everyone, and I mean EVERYONE, introduces bugs in the code, only to be surprised by them later. Some people...