I've been reflecting recently as to how well the unix shell has held up over time. What else have I used over and over?
Debug Print at the right level of abstraction.
Functional Decomposition that serves me first.
Shell Scripts that transform input to output.
Graphviz for rendering simple networks, and then some.
Integrated Functional Tests for test-driven development.