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 реализовал случайный начальный уровень заряда и его изменение во времени в зависимости от мощности станции. Это позволило проверять новые сценарии взаимодействия без доступа к физической станции.