Systematic Debugging Techniques
This class is part of the PhD curriculum Advanced Development Techniques.
This class is aimed at researchers developing their own scientific software
and intends to illustrate an approach to debugging in such a context that, on
one hand, is guided by rational principles and systematic techniques rooted
in theory, but, on the other hand, does not neglect concrete aspects and the
use of practical tools of the trade.
The material is covered by these books (in decreasing order of relevance):
- Why Programs Fail: A Guide to Systematic Debugging, by Anderas Zeller
- The Developer’s Guide to Debugging, by Thorsten Grötker, Ulrich Holtmann, Holger Keding, and Markus Wloka,
- Test Driven Development: A Practical Guide, by Dave Astels,
- The Practice of Programming, by Brian W. Kernighan, and Rob Pike,
- Code Complete: A Practical Handbook of Software Construction, by Steve McConnell.
Outline of the lectures
The class is divided in four modules:
- What this class is not about
- Automated debugging is impossible (Rice’s theorem)
- Scientific method and debugging
- Rerpoducibility [VAGRANT]
- Keep track (version control) [HG]
- Deducing and predicting
- Code smells and static analysis [SPLINT], [FB]
- Divide et impera: delta debugging [DD]
- Static (contract) and dynamic assertions [DAIKON]
- A testing taxonomy: unit testing [JUNIT], [NOSE]
- The object and its double: dummy, fake, stub, and mock [LUDIBRIO] (dependency injection, monkey patching)
- Coverage [EMMA], [CPY]
- Mutation testing (fuzzing) [JAVALANCHE]
- Test driven developement
You can find the code (and not only) that is used during the class at GitHub.
Getting the credits for this class depends on having a bux-fix accepted in an
open-source project of your choice.
Come talk to the teacher to define the detail.