What tools and techniques do you use for exploring and learning an unknown code base? 

I am thinking of tools like grep, ctags, unit-tests, functional test, class-diagram generators, call graphs, code metrics like sloccount, and so on. I'd be interested in your experiences, the helpers you used or wrote yourself and the size of the code base with which you worked. 

I realize that becoming acquainted with a code base is a process that happens over time, and familiarity can mean anything from "I'm able to summarize the code" to "I can refactor and shrink it to 30% of the size". But how to even begin?

what I've always done is the following:

Open multiple copies of my editor (Visual Studio/Eclipse/Whatever)  and then debug and do line breaks step through the code.  Find out the flow of the code, stack trace through to see where the key points are and go from there.

I can look at method after method - but it's nice if I can click on something and then see where in the code it's executed and follow along.  Let's me get a feel for how the developer wanted things to work.
