Нормальное состояние
Первый раз читать чужой код это почти всегда стресс. Ты открываешь проект и видишь куча папок, непонятная структура, разные стили кода. Снаружи кажется, что система есть. Заходишь глубже, и начинается: где-то слои соблюдаются, где-то нет, где-то всё через сервисы, где-то напрямую через модели. Это нормальное состояние. Проблема не в тебе. Проблема в том, что ты пытаешься читать код хаотично. Чтобы не утонуть, нужен алгоритм, не читай всё подряд, а конкретный маршрут.

Алгоритм чтения
Начни с входной точки, не с моделей, не с базы данных. Начни с того, где система принимает запрос: controller, handler, endpoint. Там всегда есть начало. Дальше пройди через маршрутизацию: какой URL, куда он ведёт, какой контроллер вызывается. Это даёт первый контекст: что вообще делает система на этом пути. Потом смотри, что делает контроллер? В хорошем сценарии он вызывает сервис или use-case. В плохом сценарии логика прямо там. Важный момент, не пытайся сразу "исправить в голове". Твоя задача понять, как сейчас работает. Потом уже делай заметки и фиксируй проблемы. Базовый маршрут: контроллер - use-case - домен.
Главная ошибка
Самая частая ошибка начать сразу оценивать: "это неправильно", "я бы сделал лучше". Не надо. Сначала разберись, как это работает. Ты почти всегда увидишь хаос, где-то слои соблюдаются, где-то нет. Это нормально для любого живого проекта. Если не умеешь читать чужой код, ты не сможешь работать в команде. Потому что 90% времени ты будешь работать не со своим кодом.
Breakpoint
У меня был переломный момент, когда мы с сильным разработчиком сели, выработали правила, описали структуру, добавили примеры. И только после этого код стал читаемым. Потому что читаемость это не талант. Это стандартизация. Со временем происходит сдвиг: ты перестаёшь теряться и начинаешь ориентироваться в системе. Это и есть признак того, что ты вырос.