V4D

октябрь 2024 г. — февраль 2025 г.

V4D — система управления зарядной инфраструктурой и мобильное приложение, с помощью которого водители могут найти станцию и управлять зарядной сессией.

Я руководил командой mobile- и backend-разработки: участвовал в проработке требований, декомпозиции и архитектурных обсуждениях, проводил code review и планировал релизы. На момент моего участия продукт уже имел реальных пользователей.

Backend был написан на Kotlin, мобильное приложение — на Kotlin Multiplatform. Я не был экспертом в Kotlin, поэтому не писал код, а отвечал за устройство системы, процессы разработки и инфраструктуру.

Примерно за неделю я реализовал первую версию интерфейса обновлённой панели управления. Позднее мы наняли frontend-разработчика и передали ему дальнейшее развитие панели.

Параллельно команда переводила backend с монолита на микросервисы, чтобы изолировать компоненты системы и повысить её отказоустойчивость. К завершению моей работы мы выпустили обновлённую версию мобильного приложения и подготовили единый процесс сборки основного и white-label-продуктов.

White label

Одной из задач было создание white-label-версий мобильного приложения и панели управления для разных поставщиков зарядных станций. Нужно было выпускать несколько вариантов продукта из общей кодовой базы.

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

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

OCPP и эмулятор зарядной станции

Для работы над проектом я погрузился в протокол OCPP и поддерживал существующий сервис на Python для взаимодействия с зарядными станциями.

Для ручной сквозной проверки backend, мобильного приложения, тарифов и жизненного цикла зарядной сессии использовался эмулятор зарядной станции на JavaScript. Его отдельные инстансы подключались к backend как реальные станции, обменивались данными и имитировали процесс зарядки.

Я исправлял ошибки эмулятора и добавлял сценарии под новую функциональность. Например, для поддержки State of Charge реализовал случайный начальный уровень заряда и его изменение во времени в зависимости от мощности станции. Это позволило проверять новые сценарии взаимодействия без доступа к физической станции.