1) если речь о своем коде, я стараюсь писать его так что бы не нужно было все это помнить:
- осмысленные названия функций/методов/переменных
- локальность, все стремное выносится в отдельные функции/методы в рамках которой все просто и логично, дробить все на маленькие понятные вещи это пожалуй самое простое что можно делать
- SOLID
2) если речь о чужом коде, дебаггер, листик и ручка, рисую схемки и т.д, плачу... Если могу, опять же начинаю потихонку куски кода выновить в отдельные функции и т.д. если мне это мешает и этот код мне надо не тупо почитать да разобраться а потом еще и править придется.