Abstraction is the key to managing complexity in large software systems.
The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.