Как вы читаете чужой код? (legacy)
Публичный пост
30 июня 2021
802
Маленькой предисловие:
Недавно перешёл на новую работу (стартап), и с головой окунулся в чтение чужого кода.
То что я уже опробовал:
-Не работает:
- Тактика чтения в лоб, помогает мало, так как через несколько вложенных функций уже забывается, что было в исходной. А если всё наxодится в разные либах, то мозг вскипает!
- Расставлять break points и смотреть состояния переменных, не всегда возможно, так как всё крутится в облаках ( ну либо у меня не достаточно опыта).
-Работает:
- Читать документацию, там где она конечно есть.
- Бьютилизировать json'ы click .
- Звонить коллегам, которые писали этот код ( если они ещё есть в команде).
- Чашечка кофе и музыка.
Kак у Вас происходит процесс вкатывания в legacy?
Вкатываюсь в легаси путем закрытия задач: фиксенья багов и имплементации новых фич. Постепенно понимаешь то в одном, то в другом месте, как что где работает. Иными словами, через практику. Проверено на разных стеках, разных размерах, как и коммерческие, так и OSS. Просто так чтение кода лично для меня не работает в качестве вкатывания в проект/легаси. Но при этом могу и ногда "полистать" чужой код на гитхабе, чтобы посмотреть, как другие пишут, подметить какие-то фишки, стиль.
Примерно в таком порядке:
Для меня самая боль — это легаси код с кучей абстракций. От людей, которые обчитались всякого про DRY и SRP, но поняли это все так странно, что вся логика размазана мелкими мазками по всему проекту и никак не складывается в логичную историю. По сравнению с этим код в процедурном стиле с методами по несколько тысяч строк читается легко и запросто рефакторится.
Нередко приходится читать код сквозь слёзы…
А вообще, для начала пробую ознакомиться с докой фичи/проекта. Потом уже с кодом. Если просто ознакомления с кодом недостаточно - ищу товарища, который собсно писал этот проект фичу.
Если в проекте есть тесты, туда тоже полезно заглянуть. Могут помочь в понимании тоже.
Если код настолько большой или сложный для восприятия, что сразу непонятно, что происходит (ну или его в целом нужно перенести/переписать) - то я для себя на бумаге рисую логические схемы типа
старт -> получение данных из Х (тут список полей) -> условие - получение данных из У (список полей) -> завершение; иначе -> модификация -> возврат данных.
без каких-либо конвенций типа UML, просто как мне удобно.
С трудом :D
Иногда визуализировать помогает, типа скетчинг или схемами - чтобы размотать структуру. "Игла в яйце, яйцо в утке, утка в заяце, заяц фшоке".
Сначала можно почитать https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
Она слегка opinionated, но все равно, есть что оттуда надергать из подходов.
Во-вторых, читать надо активно. То есть либо строить схемы какие-то (что как с чем соотносится) либо рисовать какие-то code flow, чтобы понимать как идёт исполнение. В итоге у меня на новых проектах обычно есть пачка каких-то схем, от разных точек входа (например, отдельно для запросов юзера, отдельно для старта приложения и тд и тп)
В-третьих, я стараюсь плюс-минус активно ломать свои догадки. То есть вижу и думаю что-то "ага, я думаю что аргумент XXX тут для того, чтобы потом вот здесь использоваться как YYY". После этого либо меняю код в ХХХ так, чтобы он сломался в YYY, либо пишу маленький кусок рядом, чтобы посмотреть и тд.
В целом я стараюсь избегать начинать знакомство с проектом с чтения кода в пользу большей практики:
Концептуально, в процессе всего этого, пытаюсь понять допущения и решения, принимаемые при разработке, и замапить архитектуру на что-то, с чем я уже имел дело.
Что работает
Изучение использованных технологий дает сразу ворох документации и понимания использованных подходов.
Если код мне совершенно непонятен (плохой код, нет тестов, не у кого спросить и т.п. - всё сразу), то я его просто постепенно переписываю так, чтобы мне было понятно. В процессе что-то будет всё время ломаться, но, к счастью, я не в банковской сфере работаю и не в гугле.
В зависимости от архитектуры можно брейкпоинт и на удаленном деплое поставить, если это например Java-деплой, в котором эта функция разрешена. Но лучше конечно научить(ся) деплоить локально, если это физически возможно (т.е. не требует терабайта памяти).
Документация конечно хорошо но много раз натыкался на то, что легаси работает не так как написано в доке или даже в комментах.
Потому иду итерациями
😱 Комментарий удален модератором...