Рисуем квадратики, чтобы разобраться в задаче ✍️

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

Я сажусь и разбираю флоу в заметках или рисую квадратики на листочке. Беру один запрос или одно действие и смотрю, какой путь оно проходит. Где оно начинается, в каком виде, кто его первым принимает. Как оно меняется, передаётся от одной функции к другой, от одного сервиса к другому.

Например, в браузере нажали кнопку. Куда пошёл этот клик? Кто его обработал? React-компонент, который потом обновляет локальное состояние или стейт-менеджер? Кто решил, что делать дальше? Где данные могут «застрять» или откатиться назад, а где путь только вперёд? Когда мы ходим во внешнее API - в какой момент наше приложение отдаёт управление, а в какой момент наш сервер говорит «да» или «нет», и что происходит между этими точками?

Возьмём конкретный пример из браузерного event loop. Пользователь кликнул кнопку. Событие попадает в очередь задач. Event loop выбирает задачу, выполняет её, затем проверяет очередь микрозадач - там могут быть промисы, которые резолвились во время выполнения. После микрозадач наступает момент для рендеринга: пересчёт стилей, layout, отрисовка. И только потом браузер готов к следующему клику. Если не понимаешь этот порядок, можно долго гадать, почему обновление состояния не сразу видно на экране.

Или вот Nuxt-SSR. Пользователь переходит на страницу. Запрос приходит на NodeJS-сервер. Nuxt определяет маршрут, выполняет функции для отправки асинхронных запросов на сервере, делает запросы к Django-API. Vue-компоненты рендерятся в HTML-строки прямо на сервере. Готовая страница отправляется браузеру. А потом начинается гидратация. JavaScript оживляет статичный HTML. Если не видишь этот путь, непонятно, почему данные не загружаются или почему первая отрисовка такая медленная.

В микросервисной архитектуре ещё интереснее. Пользователь создаёт бронирование корта на теннисной платформе. Запрос приходит в шлюз. Шлюз публикует событие в Kafka. BookingService и AvailabilityService подписываются на это событие и начинают обработку параллельно. AvailabilityService проверяет свободные слоты и публикует результат проверки. BookingService получает результат, подтверждает бронирование и публикует событие. NotificationService и AnalyticsService подписываются на результат и делают своё дело. Если не понимаешь этот поток событий, можно часами искать, где застряло бронирование или почему уведомление не пришло.

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

Такой подход помогает не просто чинить баги, а понимать, почему они возникают. И главное - начинаешь чувствовать систему, а не просто знать, какой файл открыть. Это как знать не только адрес дома, но и все дороги к нему.

А вы когда-нибудь так делали? Не писали код, а сначала долго смотрели/рисовали, как данные «бегают» по программе? #разработка #проектирование

Рисуем квадратики, чтобы разобраться в задаче ✍️ | Сетка — социальная сеть от hh.ru