Не будьте героем
Привет, Хабр! Я Женя Кучерявый, директор по фронтенду в Rentu. В этой статье расскажу как мы переезжали с Vue2 на Vue3, какие шишки набили и чему научились. Статья не хардовая.
Начнём со стека, который у нас был:
Стек как стек, хоть и староват. Но переехать всё равно хотелось и вот почему:
Медленный код.
Утечки памяти.
Плохой DX.
Легаси-технологии, на которые трудно нанимать людей.
Проблемы с онбордингом.
Долгие пайплайны — на деплой могло уходить 1–2 часа.
Всё бы ничего, но кроме причин у нас появился ещё и повод — 31.12.2023 прекращалась поддержка Vue2, что ещё сильнее усугубляло имеющиеся поводы.
Согласование
Обговорив всё это с CTO я составил простой план миграции:
Вырезаем старое.
Обновляем зависимости.
Переезжаем.
Задача понятная, но трудоёмкая, потому что вырезать нужно было много всего. Например, мы не хотели переезжать ещё и на Nuxt 3, потому что он в целом нам не нужен — система закрытая, SSR неоправдан.
Оценив план, CTO прикинул, что в целом это безопасный вариант, но потенциально бесконечный. Поэтому он предложил альтернативу — просто создать новый проект с скопипастить туда код, выкинув всё ненужное.
Приключение на 20 минут
Я на такие вещи падкий. Мне говорят, что можно выкинуть старое и запилить новое — я соглашаюсь. Спойлер: зря.
Чуда не случилось
И чтобы объяснить, почему же CTO вообще предложил такой вариант, нужно сделать несколько отступлений:
CTO удачливее меня. Например, мы вместе ныряли с аквалангами. Ему стало нехорошо, он показал жест инструктору и его подняли. А я в тот день чуть не умер (кулстори по запросу).
CTO трудоголик, которого лучше всего описывает его же цитата: «Наконец-то выходные, смогу нормально поработать». При оценке он просто помножил свою эффективность на количество человек в команде фронтенда.
CTO не трогал фронт больше года.
И это моя первая ошибка:
Проигнорировал красные флаги при планировании.
Но процесс уже был запущен
Я разбил переезд на 120 задач, завёл таблицу в вики, чтобы не дублировать компоненты и мы начали переезд. По изначальной оценке месяца должно было хватить.
Спустя месяц я отчитался об успешном закрытии 80 задач из 120. Не фонтан конечно, но дополнительный месяц нам одобрили, поэтому мы продолжилил миграцию.
Я же в это время осознал, что месяца нам мало:
Люди долго возятся с задачами.
Сложно проводить ревью.
Какие-то компоненты дублируются, несмотря на таблицу.
И это моя вторая ошибка:
Слишком большие задачи.
Ничего не оставалось, кроме как декомпозировать их.
И вот спустя месяц я отчитываюсь, что мы закрыли 130 задач из 160.
Ещё месяц спустя закрытых задач уже было 160 из 200.
Не буду ходить вокруг да около и сразу скажу, что в итоге на переезд потратили 350 задач + ещё куча ушла на багфиксы.
Очень много задач
Не справляемся
Тут я уже начал выгорать, потому что люди плохо справлялись, несмотря на мои усилия. Чтобы спасти положение я решил бросить все свои силы на это и тоже начал писать код:
Работал за троих
И это моя третья ошибка:
Работал с кодом, когда нужно было работать с командой.
Переезд закончился
Несмотря на боль, выгоряние и растягивание сроков, мы всё же завершили переезд. Всего-то потребовалось 30 человеко-месяцев вместо 8.
Мы обзавелись новым стеком:
Vue 3.
Element plus.
Bootstrap (в процессе выпила)
amCharts 4 и 5 (почти всё на 5).
Vite.
Vitest.
Велосипеды получше.
Показатели тоже значительно улучшились:
Dev-сборка за секунду, а не за 2 минуты.
Потребление памяти меньше в 2 раза.
Улучшенный DX.
Свежие версии зависимостей.
Деплой за 7 минут, а не за час.
Чему мы научились
Всего три простых пункта:
Невовлечённые люди не должны влиять на планирование.
Декомпозируйте.
Работа с людьми эффективнее работы с кодом.
И всё?
Выводы какие-то на уровне джуниор-тимлида и из разряда «Делайте хорошо, а плохо не делайте».
Постная хрень
Что же было на самом деле? И почему в других компаниях смогли переехать гораздо быстрее нас?
А ответ на самом деле очень простой — потому что мы совсем недавно были стартапом. А стартапы выживают за счёт такой практики как hero engineering — когда вы работаете на износ, чтобы закрыть любую проблему. Будь то упавший прод или нереалистичные сроки.
И тут у нас небольшой флэшбек:
Люди плохо справлялись, несмотря на мои усилия.
Но на самом деле всё было немного не так:
Люди работали недостаточно, чтобы закрыть переезд в срок.
И тут даже сложно этих людей винить. Не они согласовали сроки, не они затеяли такой длительный марафон, на котором hero engineering перестаёт работать, потому что все уже выдохлись.
И вообще это практика, которая очень сильно стреляет в ногу на длинной дистанции. Это как держать человека, который 24/7 вычерпывает воды из вашей лодки, хотя можно было просто заделать пробоину.
И это моя настоящая ошибка:
Геройствовать, чтобы скрыть косяки менеджмента.
Настоящий вывод
Не будьте героями!