Средства отладки

Сколько времени мы тратим в день, разбираясь в коде? Согласно этой статье — 75%.

График: 75% -- понимание кода; 5% -- написание нового кода; 20% -- изменение существующего кода Источник: dmitripavlutin.com

Это не удивительно. Хотя есть такая тенденция, что за людьми закрепляют какие-то части системы, все равно нам каждый день приходится читать чужой код. Свой код бывает понять сложно, а чужой дается нам еще тяжелее. Я уже писал про командную работу и про любителей абстракций в которых затрагивалась тема когнитивной нагрузки. Каждый день на нашей работе мы грузим свою голову по полной. И чем нагрузка выше, тем больше вероятность, что мы не захотим разбираться в том что есть, и начнем искать другие способы исправить/обойти ситуацию.

Чтобы не прийти к неправильным решениям, вроде поверхностных костылей, переписывания с нуля, и т.п., нужно иметь ввиду способ, который значительно помогает снизить когнитивную нагрузку.

Процесс понимания кода сильно помогает анализ его работы в рантайме. И тут уже, как раз, есть где развернуться воображению.

Визуализация как способ снизить когнитивную нагрузку

Самым простым средством отладки являются логи. При отсутствии возможности использовать нормальный отладчик, мы можем прибегнуть к консоли и логам. Но тут есть нюанс. Разбиратсья в логах – это как проводить расследование.

  • логи нужно сопоставлять с кодом, и тогда уже делать умозаключение
  • логи не просто читать, так как там бывает много лишнего, и нужно выцеплять только самое важное
  • логи сложно смотреть и анализировать в реальном времени

все это в комплексе может только увеличить нагрузку на ваш мозг.

Другое дело, если вы можете визуализировать все эти вещи. Человек так устроен, что графику ему воспринимать гораздо проще, чем текст. Именно поэтому консольные интерфейсы были вытеснены графическими. (Вы не подумайте, я все равно фанат консоли).

Gizmos в Unity – очень удобное средство для отладки. Вот вам один пример.

Другой пример я приведу из жизни. Я работал над match3 игрой, с довольно сложной бизнес-логикой. Фишки имели кучу статусов, на них могла повлиять куча событий. Во время геймплея на поле уследить за всем сразу невозможно.

В какой-то момент на поле просто все ломалось. Например, фишка залипала в середине поля и никуда не двигалась. Почему это произошло, в какой момент, как это повторить? Выяснить эти вопросы было большой проблемой.

Начинал я с логов. Смотря на логи я прогонял все в голове на предмет возможных ошибок. Но этот способ быстро показал себя неэффективным. На поле происходило слишком много событий, и вычленить что-то важное было довольно сложно.

В редких случаях удавалось понять конкретные шаги по воспроизведению бага, тогда любимый отладчик спасал.

Касательно отсальных случаев, я понял, что без визуального дебага мне не справиться. Поэтому для игрового поля я сделал Gizmos, которые рисовали разную полезную инфу:

  • текущий статус фишки
  • заблокирована или не заблокирована ячейка
  • куда посыпятся фишки, если им нужно будет обтекать препятствия и т.д.

Следить за полем в реальном времени стало сразу намного проще. Чтобы понять какая фишка в каком статусе, мне не надо было копать логи или ставить брейкпоинт, я могу просто посмотреть в соседнее окно. Ко всему прочему, я мог ставить игру на паузу, и, шагая по фреймам, видеть что происходит на поле под капотом.

Затем, я добавил краткую очередь/историю обработки команд, из которой было понятно что проиходило/произойдет на поле в ближайшее время.

Визуализация позволяет снизить нагрузку на наш мозг, что позволяет легче интерпретировать работу кода в рантайме. Держать в голове матрицу 8x8 с кучей состояний – то еще удовольствие, я вам скажу. Другое дело – видеть все перед глазами.

Еще, как пример, возьмем стейт-машину в Unity. Если бы она визуально не отображала переходы, в рантайме не показывала текущее состояние, то отладка была бы значительно сложнее.

Читы как способ упростить отладку

Читы – тоже мощное средство. Если вы часто делаете какое-либо действие, чтобы что-то отладить, и оно занимает много усилий, то его обязательно надо автоматизировать читом. Возвращаясь к примеру match3, забиндив несколько шорткатов а-ля ctrl+click, shift+click я сделал применение различных бонусов на поле. Это позволило мне создавать тестовые кейсы просто покликав.

Позже я добавил возможность сохранять и загружать какое-либо состояние поле и отсылать его с устройства, чтобы потом можно было загрузить у себя.

Полезных читов может быть очень очень много, никогда не бойтесь тратить на них время. Они окупят себя сторицей. Тестеры вас тоже за них отблагодарят.

Слепок состояния

Я уже писал, что, если игра позволяет, то можно делать слепки состояний, с полными логами команд, как я описал здесь. Кстати, использование кастомных окон и эдиторов в Unity – это тоже великолепный способ упростить отладку.

Удаленная консоль

Помните консоль в quake? Бывает так, что баг воспроизводся только на устройстве. Тогда нужно иметь продвинутые средства отладки. Например, полезно посмотреть иерархию объектов сцены, что довольно затруднительно, если вы отлаживаетесь на устройстве.

Или, может, нужно иметь возможность повлиять как-то на объекты сцены: дампануть состояние, передвинуть и т.д. Если встроить в приложение http сервер, которые умеет принимать команды, то можно замутить интересные средства для отладки.

Unit-тесты как быстрый способ проверить утверждения

Unit-тесты полезны не только для того, чтобы следить за тем, что мы что-то поломали. Один из моих любимых способов разбираться в коде – это писать маленькие Unit-тесты для проверки предположений.

Например, если я вижу какой-то кусок кода, который исполняется только у high-level пользователей, обычно мне надо запустить игру, зачитить себе уровень, накидать, например, айтем, который связан с этим кодом, и только тогда я могу его проверить.

Вместо этого пути, я могу по быстрому накидать маленький unit-test и проверить свое предположение. Для меня это работает значительно быстрее, чем проверять все в рантайме игры.

Подводим итоги

На самом деле, список далеко не полный. Он ограничивается только вашей фантазией. Я часто вижу, что люди мучаются, стонут, выполняя одни и те же действия. Жалуются, стонут, но продлжают делать так же.

Мы же с вами программисты, так почему не упростить себе жизнь? Задумайтесь, может и вам можно придумать какое-нибудь средство для отладки, которое сделает вас немножко счастливее. Или, быть может, вы давно откладывали это на потом? Значит вот он знак, пора бы этим заняться ;)