This book is written for anyone familiar with programming in Java who wants to more effectively prevent, explain, communicate about, or fix bugs. This may include developers from industry, the government, or academia, was well as computer science students. Developers in each of these categories possess a wide range of skill in debugging.
In the case of computer science students, skill employed in debugging correlates greatly with the nature of the curriculum. Some curricula focus heavily on large-scale software development, and students of such programs tend to gain a great deal of debugging experience early on. Other curricula focus much more on the theoretical aspects of computer science; students in these curricula develop a great deal of advanced theoretical knowledge, but they often acquire much of their debugging skill once they are already working on real-world software projects.
In industry, many companies have tried to alleviate the shortage of highly skilled programmers by filling programming positions with individuals who have no formal education in software development. Typically, these programmers possess advanced technical abilities in other domains, which allows them to adapt quickly to many aspects of the programming process. But in many respects, software development is quite different from other forms of engineering, and certain aspects of programming can remain elusive for a long time. One such aspect is effective testing and debugging.
Because of the wide variety in the backgrounds of programmers, this book is not targeted at programmers of any particular level of experience. The only knowledge I assume is readers possess a working knowledge of the Java language. Knowledge of object-oriented design patterns is helpful (but not necessary) for understanding some of the examples. Similarly, experience with the extreme programming method of software development will provide added context, but the aspects o that method relevant to debugging are explained in the text. In general, the material should be accessible to programmers with many different backgrounds.