Иногда помогает просто поставить точки останова и посмотреть в отладчике, как реально данные меняются внутри функций. Это проще, чем пытаться сразу выучить весь код целиком — видно, что именно откуда берётся и куда уходит. Особенно если код неструктурированный и в нем столько ветвлений, что голова идёт кругом.