Começo com a documentação do projeto. Em particular, a especificação - que informa a intenção da coisa que está sendo analisada.
Se possível, analiso as notas e a documentação do projeto para obter uma amostra geral de como isso foi feito, do processo de pensamento, do estilo e da natureza das pessoas envolvidas.
Se possível, converso com as pessoas que trabalharam nele - o que faz? Quão? Por quê? Onde estão enterrados os corpos?
Há uma tendência entre os desenvolvedores de entrar no código: "Deixe-me mostrar esse código". Isso é bom para eles, mas tende a seqüestrar minhas necessidades - que é entender o alto nível que dá contexto às coisas de baixo nível.
Ele usa grandes quantidades de poder do cérebro para analisar pequenos pedaços de código, fora do contexto completo e entender qualquer coisa significativa. Portanto, se possível, fazer com que os desenvolvedores falem sobre o PRINCÍPIO, a estrutura, as unidades, os módulos, o que quer que tudo leve à apreciação da tarefa.
Só então vale a pena tentar entrar no código.
No grande esquema das coisas, olhar para o código é como olhar para uma página cheia de zeros e zeros. Há significado, mas leva muito tempo para descobrir. Obter uma amostra de onde procurar e quais partes são significativas ajuda a restringir o espaço de pesquisa.
Tudo o que disse - quando não há doco, não há pessoas e apenas código -, não há nada a não ser olhar para o código.
Nesse caso, eu normalmente não tento entender por uma leitura lenta e profunda, faço um passe rápido, leio rapidamente tudo. Às vezes, isso é apenas abrir arquivos e pressionar a tecla de página para baixo. Você pode obter uma incrível apreciação de uma imagem grande apenas fazendo isso. (E, em alguns casos, eu até despejo de arquivos executáveis e os vasculho, procurando assinaturas e padrões. Isso tem sido incrivelmente proveitoso nos últimos 20 anos.)