Persons working in the field of computer science analyze programs for correctness and to understand their efficiency for solving problems. Testing is the most obvious way to analyze correctness; although it does not prove correctness, it can certainly disprove it! Data for testing must be selected to reflect a range of typical cases, including boundary cases and erroneous cases, which should be handled with error messages or exceptions. Debugging refers to the discovery and correction of errors in a program. These errors can be found through testing or careful analysis. Students should be able to handle all three categories of errors: runtime, compiler, and logic errors. Debugging techniques include hand-tracing of code, adding extra output statements to trace the execution of a program, and using a debugger to trace execution and display selected values as it runs and when it crashes. Students should be encouraged to experiment with available debugging facilities, but they should also be able to rely on more primitive debugging methods, which will serve them in whatever environment they encounter in the future.