Over the years, we’ve had several discussions with higher-level RAD developers who
claim that they really don’t see the need to learn about these low-level topics. After all,
the beauty of writing code at a higher level is that all of the low-level intricacies are
abstracted and hidden away from the developer. We couldn’t agree more. However,
our claim is that although abstractive programming allows the developer not to have
to focus on low-level details, it does not negate the need to know how the abstraction
really works. The substance behind this claim is simple. What you are working with is
really just that—an abstraction. Usage of this abstraction in a design that it was not
suited for can cause serious problems in your software; and, in such a case, without a
solid understanding of how the abstraction works, it can mean the difference between
shipping your product on time and slipping the release date by several months.
Another key factor when considering mastering the Windows debuggers and tools
is related to the debugging of live production servers. While every attempt should be
made to fix bugs before shipping a product, we all know that some bugs might slip
through the cracks. When these bugs do surface post release, it can be a real
headache tracking them down. Customers who encounter the bugs on live produc-
tion servers are typically very sensitive to downtime and configuration changes, mak-
ing it impossible to install a complex debugger package. The Debugging Tools for
Windows, on the other hand, enables live debugging with no server configuration
change and no installation requirements. In short, it enables customers to keep a pris-
tine server during the troubleshooting process.
Quality Assurance Engineers
Just as software developers will find the information in this book useful in their day-to-
day tasks, so will quality assurance engineers. Quality assurance typically runs a battery
of tests on any given component being tested. During this time, any number of bugs
can surface. Whether they are memory corruptions, resource leaks, or hangs, knowing
what extended instrumentation to enable during the test run can dramatically reduce
the time it takes for root cause analysis. For instance, imagine that quality assurance is
tasked with stress testing a credit card authorization service. One of the goals is that
the service must be capable of surviving one week of continuous and simultaneous
hammering by client requests. On day six, the service starts reporting errors for all
client requests. At this point, the developers responsible for the service are called in to
analyze the problem. It doesn’t take long for them to figure out that the server has run
out of memory, presumably due to a small memory leak that accumulates over time.
After six days of accumulated leaks, figuring out the source of the leak, however, is a
much bigger challenge that can take days of debugging and code reviewing. Had the
correct extended instrumentation been enabled while running these tests, the time it
would have taken to analyze the leak could have been greatly reduced.
Preface xvii