Whenever I am faced with a new code base, documented or not, I start like this:
1) End user experience. How do end users view/experience/use this product? What is the user interface? Are there more than one kind of user (e.g. user, admin, sysadmin, content author, etc)? If so, what is the perception of the product for each kind of user. What kind of install or run time configuration options are there? What do the typical sysadmin or upkeep tasks look like? Work through any existing end-user documentation.
2) Build process. What does it take to checkout a new tree, build, and package the product? This should be repeated for every platform that is supported by the product. If the answer is not "run this single command"...then there are issues for improvement.
3) Test Suite. What does it take to verify that the build/packaged product is correct. How can I run an automated test suite, or run sufficient hand tests to know that the built product is correct.
4) High level architecture (Packaged/Installed). What is the arrangement of the application in a packaged/installed form? Where are the important files? What other software/hardware requirements are there for a successful installation?
5) High level architecture (Source/Build). What is the arrangement of the source code and makefiles or build tools? How does that arrangement map into the packaged/installed version of the product.
6) Low level walk through of "critical code". I want a "street level" view of the user interface, main libraries, API's, test code, etc, etc.
7) Change control or branching policy: What is the policy and procedures for getting a change into the product? Design docs? Bug tracker? Desk checks? Code reviews? Branching policy? QA involvement?
8) Initial coding tasks (with mentor & guidance):
- Write a new test
- Fix a minor bug (typo in message, better message, debug output, etc.)
- Alter the packaging to include/exclude a file
- Fix a larger bug
9) Repeat coding tasks until you are basically functional checking out the product, building, making changes, and getting those changes back into the source control.
10) Take ownership of some module/library/hunk of code. Reverse engineer and document the code, and present to the remainder of the team.