For a complex project, most development time is spent debugging, but often the experience is very poor.
Furthermore, the ability to understand and debug a program limits the complexity that a software developer can handle.
Therefore, a successful program should be designed to be debuggable - easy to inspect and modify.
A clear understanding of program state speeds debugging and improves design.
Context should expressed in a way that can be navigated quickly.
Once the area of interest had been located, tools are necessary to pick apart the details.
Often, the program will be run many times, only making small changes, while looking at different aspects, so this is the "inner loop" of debugging.
The ability to quickly verify changes gives confidence and allows aggressive development while maintaining stability.
assert_error()
is used liberallyvoid test_foo() {...}
eval -t foo
make test
runs all tests and diffs with stored test output