Кранчи и кидалово в Magic Kids

Кранчи и кидалово в Magic Kids


Лонгрид с картинками. Самые интересные картинки и суть ситуации - в конце


Действующие лица

magickids.me – «американский стартап с российскими корнями». Здесь разворачиваются события.

magicquick.me – российская студия («донор»), делающая XR-проекты на заказ. Оформлена на российское ИП CEO. Здесь зарабатываются деньги.

magicplaybox.us – «отделившаяся» после февраля AR-студия для работы с зарубежными заказчиками.

Толя – CEO, co-founder, NJ, USA.

Марианна – CTO, co-founder

Оля – CPO, PM. Мануальный тестировщик.

Рома – я, Team Lead Unity Developer в Magic Kids Inc.

Паша – второй Unity Developer в команде MK.


Pre-story

В феврале я устроился работать в игровой стартап Magic Kids. Вот с таким оффером:

Привожу для понимания обязанностей и развития сюжета. MK вырос из AR-приложения с 3 мини играми, за время нашего знакомства – оброс сюжетом (релиз в мае) и мультиплеером (последняя зона моей ответственности). Понравился тем, что не гиперкэж, не донатная match-3, а большая story-based игра, с привлекательным для меня геймдизайном и на актуальном стеке. Интересно и приятно разрабатывать.

Есть дыры в процессах, некоторые вещи делаются быстро и на коленке, присутствуют овертаймы. Но это геймдев, команда небольшая. Сам проект мне нравится, отношения в целом адекватные.

Могу привести в пример мини-войну, произошедшую в начале. Так как бизнес требовал от UI/UX все макеты побыстрее, в этих макетах не все было хорошо: анкеры с дробными значениями «на глаз», размытое описание макетов, адовые градиенты, нет универсальных компонентов. Чтобы сверстать интерфейс мне приходилось залезать в фигму, часть привязок просчитывать и продумывать, рисуя в блокноте, экспортировать все нужные элементы по частям (например кнопку и несколько эффектов), дорабатывать, нарезать (9-sliced) и паковать спрайты в Фотошопе. До этого подход был другой: из макетов форм под отдельную фичу выгружаются все элементы в отдельную папку в проекте, остаются так или пакуются в SpriteSheet автоматической тулзой, которая режет их по альфе. В результате – по проекту раскиданы одинаковые спрайты, в sprite sheet-ах спрайты либо в шакальном качестве либо обрезаны. Я как могу привожу это в порядок, но рефакторинг ассетов случается (не до конца) только летом, а до тех пор – вылеты по RAM и сложности в верстке. Попробуй угадай какой спрайт тебе нужен – тот, что в фигме, или он уже есть в ассетах. При закрытии фичи выглядит это все не очень и от UI/UX прилетает фидбэк «не то», «некрасиво выглядит», «где блюр?» - цитаты. Появляется претензия в мою сторону мол верстаю плохо, фичи не доделаны. Ниже примеры из макета и мое объяснение с дизайнерами.

Спецификации анимаций в макете
Пояснение как располагать буквы на экране

После этого происходит довольно душный синк на полтора часа, краткий пересказ:

Толя: мини-игры выглядят как говно, очень долго в производстве.
Я: Там много вопросов к UI, логика готова, но по макетам надо обсуждать и работать.
Толя: Но макеты давно готовы, Сережа же рисовал и там все ок.
UI/UX: Толь, ты же сам просил быстрее вот мы много нюансов и не учитывали.
Марианна: «А вам не кажется, что то что мы час обсуждаем это чисто Ромина проблема. До этого же мы несколько лет как-то верстали, все работало».

К слову из диалога с ней: Как вы распределяете и делаете задачи в команде? Дружно, вместе, как-нибудь - цитата. После этого был личный диалог с Толей:

Ром, я подход Марианны не поддерживаю, нужно чтобы проект рос и развивался. Ты нам нужен как тимлид именно для того, чтобы такие процессы обозначить и настроить.

Привожу не чтобы в кого-то ткнуть, а обозначить настрой и позицию СЕО, что и как именно я должен делать: перейти от тяп-ляп к понятным планируемым процессам. Я же все таки на позициию лида прихожу. Вешаю ружье в этой истории – в конце оно выстрелит.


The Call to Adventure

В начале весны мы втроем с CTO и CPO садимся декомпозировать user story в dev задачи. Раньше такого не было. Потратили почти 2 полных дня на болтовню, но все разобрали и обсудили – задачи весной идут по плану, таски закрываются. Собираемся на большие синки: обсуждаем бандлы с бэкендом, результаты фокус-группы, разделение конфигов на dev/prod, статус билда, планирование. CTO берет себе часть задач, подсказывает по проекту где что: активно участвует в проекте. Кстати совмещает со второй работой в универе и проектами в студии. С задач студии пришел Паша – он со мной фуллтайм погружен в МК.

Проходят Open Mic, All Stars (обсуждение планов), Happy Hours – поговорить вечером в пятницу. Есть чат и взаимопомощь по релокации. Дейлики и спринт-синки поздние, потому что у CTO работа в универе до обеда, а CEO в Америке спит. Ну ок, у всех график смещен на вечер-ночь. Переработки есть, но их не много. В целом – атмосфера дружелюбная, драйвовая. Я стараюсь со всеми коммуницировать, въезжать в роль лида. Деньги платятся вовремя, в начале месяца.

Всё гуд, все довольны


Supernatural Aid

Появляется необходимость работать с нативными плагинами, собирать и дебажить локальные билды под iOS. В мск из офиса освобождается макбук от уволившейся PM (Ани) – выдается мне под билд-машину. MBP 2018 года на Core i5 – билдит долго и шумно, но зато я могу собирать билд пока работаю над фичей. Собираем мы их кстати вручную: addressables -> debug build -> если ок то RC для TF. До этого Паша на своем маке работал в два окна (dev + build), поэтому радостно передает мне ответственность за билды. Закрыл фичу – Оля просит билд потестировать. А еще посреди недельного спринта мог прибежать Толя с маркетинговой идеей, Марианна ее в своей ветке реализовывала и либо сама собирала RC, либо просила меня. Ну раз уж «билд-машина» у меня. 2-3 билда за недельный спринт минимум. Отвлекает, ну ок.


The Crossing of the First Threshold

К концу апреля планируется выкатить полноценный релиз в AppStore. Заменить AR-приложение с 3 мини-играми на нашу обновленную игру с сюжетом. По задачам идем ок, где-то горит, но Толя решает что до майских надо выкатить стопудово. Начинаются переработки, костыли и затупы от усталости. Пару ночей сидим с Пашей, добивая баги парным программированием. Вместе с нами для моральной поддержки в том же slack huddle сидит Оля – CPO, PM и теперь еще и тестировщик.

Паша работает по ночам
Я тоже
Коммиты разные, но все больше хардкода и костылей

Вот примеры коммитов. Сидишь до 3-4 ночи, коммитишь разное. Уже много костылей и хардкода. Задачи часто не доделываются за день-ночь а остаются в голове с которой ты уходишь спать. Часам к 12-13 дня просыпаешься, превращаешься в человека, завтракаешь и садишься за задачи снова. С горем попалам релиз выкатывается, от сгорания спасает неделя майских. Овертаймы не оплачиваются, за них нам дали 1 или 2 дня выходных допом. Все думают что вот зарелизим– и дальше будет как раньше, спокойно.


The Road of Trials

Летом разработку фич начинают подпирать и тормозить бэклог и техдолг. Скрипт QuestManager который раньше отвечал за переключение и прогресс квеста, был построен на state machine превратился в помойку с кучей ответственностей, огромными простынями и костылями if (x) return;

Хороший скрипт менеджером не назовут

Бизнес после долгих уговоров дает 2 недели на рефакторинг. За него берется Паша, так как я занимаюсь портированием и оптимизацией для Android. Так как QuestManager уже совершенно не похож на то что изначально делала и помнила Марианна, и никто его не разбирал – рефакторинг растягивается. Начался рефакторинг 17.05. 14.06 the-great-refactoring мержится в refactoring-merge. 20.06 – final коммит. С подготовкой и фиксами после – 2 месяца. Для бизнеса оказалось сюрпризом, что если год писать «дружно, быстрее, как-нибудь» то потом попадаешь на непрогнозируемый и неуправляемый рефакторинг. Бизнес не доволен. Паша недоволен что он два месяца по утрам нырял в лужу с говном. Объявляется виноватым за сроки, получает люлей (эври дейлик и на ретро в конце). Пилит пару фич и 22.7 уходит в отпуск. Я 8.06 заканчиваю с Android, переключаюсь на баги и мелкие фичи.

Начинают гореть студийные проекты, Марианна полностью отключается от MK и потом в августе уходит в отпуск. Вернувшийся Паша вместо нее занимается студийным проектом. Я с августа на МК один. Прошусь в отпуск, но мне говорят что еще много багов и фичи надо релизить. А еще таки выпустить в PlayMarket. Оля теперь тестирует билды под обе платформы iOS/Android (с двух рук), задачи и правки мне прилетают с двух сторон. В конце июля я начинаю ресерч по мультиплееру, параллельно для него готовится документация. В августе ресерч незаметно переходит в реализацию фич. Отпуска нет. Есть ощущение что вот закончу ресерч и дальше будет спокойно. Будет отпуск.

Режим переработок со времен мая немного смягчился но не исчез. Мне прилетают задачи про баги, Android и мультиплеер. Деньги платятся. В июне сказали что баксов больше не будет, получите в рублях по курсу 55-60 (потеряли 25% в зп на ровном месте). Денег меньше, но работы сильно больше (овертаймы). Плавно исчезли все Open Mic и прочие командные активности.


Abyss of death and (hope for) rebirth

Август. Я в команде остаюсь один, Марианна и Паша – на студии. Там все так горит, что Толя нанимает еще одного outstaff сотрудника. Начинаю получать за то что ресерч мультиплеера затянулся. Я напоминаю что это уже реализация, по факту. Параллельно пилится документация, геймплейнные механики и макеты для мультиплеера. Т.е. все меняется довольно часто. Я могу начать делать фичу, погрузиться, понять что чего то не хватает, пойти уточнить у гейдизайнера, инициировать новый диздок и начать делать фичу практически с нуля. Овертаймы, сложно что-то планировать, лидовых задач в команде из 1 человека понятно что нет. Из-за усталости и ковыряния в старом говнокоде работаю медленнее, приходится сидеть весь день, чтобы хоть что-то успевать. Надеюсь на то, что перетанкую за 2 недели мультиплеер, уйду в отпуск, перезагружусь, отдохну и дальше будет ок. Говорю об этом на 1-1 с Толей, он согласен. Спрашиваю про отпуск.

Толя: Давай выпустим мультиплеер, потом пойдешь. Да, все сроки растягиваются, в оценки мы не укладываемся, надо перенастраивать процессы

Мне в рамках мультиплеера накидываются новые фичи и задачи, я вижу что задач еще на всю осень, и отпуска я походу не увижу. Начались задержки в зп, якобы из-за того что налоговая пришла и списала налоги:


Transformation

Мне этот «кусочек» денег был нужен ASAP, поговорил с Толей – он перевел с личной карты в Сбере. Значит какие-то деньги есть, хотя счет ИП в Тинькофф «заблокирован». Работаю, надеясь выкатить мультиплеер, отдохнуть и потом в процессах что-то будем менять. Но в понедельник в начале сентября меня ставят перед фактом, что все меняется с этой недели. Мол Оля и Толя жалуются что все сроки сдвигаются, в оценки не укладываемся, планировать ничего не возможно.

Оля и Толя: Спринт будет не неделю а две. В начале – спринт-синк с Марианной, проходимся по карточкам с задачами, декомпозируешь, оцениваем и ты на эти сроки коммитишься. В конце спринта – разбор полетов

Типичный разбор и оценка:

Карточка «добавить таймер для мультиплеерного острова» -- макет, диздок в целом есть, но технические детали не описаны. У задачи есть только название. Дальше в диалогах цитаты:

Я: Я сделаю эту задачу за 8 часов: тут верстка, счетчик, время надо брать глобальное из конфига – переделывать расчет времени уведомлений на конфиги, сейчас хардкод.
Марианна: счетчик есть готовый, время – просто строчку у уведомлений добавить. Там делать нечего, по клавиатуре постучал и все. Ты сделаешь эту задачу за 1 час, ну хорошо за 2.
Оля: Ну как тогда оценим?
Я: Ну давайте среднюю возьмем… Хотя я вижу 8 и могу коммититься на 8…
Оля: Ну тогда 3.5?
Я: О_о. Что? Да и вроде договорились что до часу округляем.
Оля: окей, ставлю план – 5. Факт проставишь - обсудим.

Делаю таймер и остальные задачи, в конце спринта вместо разбора спринта разнос меня:

Марианна: Почему так много то, есть готовый таймер. Просто копипастишь код и все.
Я: Он был привязан на special offer и userprefs, сделан на корутинах. Чем его копипастить и дорабатывать под эту задачу я сделал Extension-method. Мне же с этим кодом в следующей фиче работать.
Марианна: Зачем, кто тебя об этом просил? Надо было сделать просто и быстро. Такое чувство что ты специально сроки растягиваешь и проект саботируешь. Делай хардкод-говонкод. Если ты не можешь быстро в нужные сроки решить задачу бизнеса, значит ты не справляешься, найдем кого-то другого.
Я. Т.е. для тебя закрытие бизнесовой задачи в срок – единственная мера качества кода и квалификации?
Марианнна: Да. Мы все винтики в бизнесе. Если ты так долго решаешь такие простые задачи – значит ты джун. Надо тогда пересмотреть твою квалификацию, штрафы какие-нибудь ввести. Чтобы ответственность была.
Я: Открой код и посмотри задачу – увидишь что я там сделал. Ты же ни задачу, ни код не видела.
Марианна: Зачем мне в код смотреть, если ты не можешь объяснить что ты сделал.

Т.е. CTO проект, задачи и код не смотрит. Оценивает задачи со своей точки зрения, с того момента, когда она последний раз код видела (январь?). Привожу аргументы, говорю: «Если есть вопросы давай вместе код посмотрим, ты убедишься что там все сложнее чем ты думаешь». Но она не хочет. «Да там все просто, этот код уже есть в проекте. Зачем мне на него смотреть?» У нее в реализации MonoBeh на 127 строк (использование имаджинировали?). Я сделал метод на 13 строк с одним твином и лямбдой внутри. Вызов - в одну строку как static метод.

Второй пример – с боковой панелью. Она есть в магазине (делала Марианна, несколько классов-контроллеров), в режиме строительства (делал Паша) и должна быть у меня в мультиплеере.

Взял последнюю у Паши – а там просто все вырезано. Одна статичнная вкладка и статичный layout. Ему весной сказали «надо быстро» – он и сделал быстро. Только в этот сайдбар ничего больше не добавишь. Начал пересобрать по образу и подобию из магазина – оно все разваливается. Куча зависимостей, анимации (которые мне в фиче не нужны) – если до конца все не настроишь – не заработает ничего. Моя изначальная оценка была 8 часов, у Марианны – 4. Пока разобрал и настроил весь сайдбар – ушло два дня. Опять же виноват я, в сроки не укладываюсь. А задача простая и сайдбар вообще готовый был. Не рабочий правда…

Третий пример: чат в мультиплеере. Сверстал, проверил – работает. Для игрока до сих пор не сохранялся никнейм – добавил поле в модель. Сохраняется, выводится в чате. Надо только существующим игрокам как-то снова имя дать выбрать – мы же забыли сохранить. Задачу с чатом закрываю вечером, про ники хочу на дейлике с утра сказать. Оля на дейлике на меня орет:

Оля: Ром, ты чего недоделанные задачи закрываешь, в тест ревью переносишь?
Я: О_о А что там не доделано? Чат работает.
Оля: Не соблюдены сейф-зоны по верстке, у пользователей ников нет.
Я: Верстал по макету, там нет сейф-зон. Уже не обратил внимания. Косяк на стороне UI, пусть скажут как – я переделаю отдельной задачей. *рассказываю про модель данных пользователя*. Мы ник никак не сохраняем сейчас. Делала это Марианна еще в декабре. Я поправил – у новых пользователей все будет. Но для существующих я данные ниоткуда взять не могу, ИХ НЕТ.
Оля: Уточни у Марианны, может они где то есть. Почему ты только сейчас об этом говоришь? Мы бы давно уже что-то решили. Опять затягиваешь, быстрее надо.
Я: Я в задачу залез, начал делать вчера днем, увидел – данных нет. Вот на дейлике говорю.
Оля: Надо было сразу. Задача значит с чатом не доделана.
Я: Привет. Там у пользователей ников нет в UserState. Их же больше ни где не вытащишь?
Марианна: Мы их рандомно генерим, даем выбрать как пол и цвет кожи в начале игры.
Я: Ага, но пол и цвет кожи в модель сохраняются, а ник – нет. Даже поля под него не было.
Марианна: ну значит не сохраняются.
Я: Тогда 3 варианта – либо генерим рандомно и присваиваем старым пользователям, либо подписываем их John Doe, либо снова показываем окошко с выбором, но уже посередине игры.
Марианна: Это продуктовое решение, его должны продакт (Оля) и геймдизайнер принимать, я сама не могу придумать.
Я: Оль, надо решить с UX, как ник выбрать. Нет его.
Оля: Давай синк поставим, с Марианной и геймдизайнером. А точно нельзя ни откуда ник достать?...

За неделю до этого, под конец рабочего дня приходит Оля с запросом на синк. Я весь в задачах, горю. Диалог:

Оля: Ром, там Толя просит быстрый синк по бэклогу и планам (на 7-8 вечера).
Я: У меня задач куча. Я бы хотел их добить, никуда не переключаться.
Оля: Ну он очень просит
Я: Окей…
Толя: Ром, привет, как дела, как настроение?
Я: Настроение очень не очень, задачи горят, я зашиваюсь.
Толя: А что не так? Рассказывай.
Я: Толь, я сейчас не готов это обсуждать. Я бы вообще хотел задачи доделать и не погружаться в споры и разбор процессов. Давай потом, а сейчас что ты хотел по планам.
Толя: ну раз ты говорить не хочешь тогда и планы обсуждать нечего
Я: Говорю же, сейчас – не готов. У меня есть куча задач которые просрочены и надо закрыть. Давай про пла…
Оля: … *открывает родмап*
Толя: Ну короче Рома нас нахуй посылает! *вылетает со звонка*

Это конец сентября. Я понимаю, что меня стараются перегрузить задачами. Бизнес в лице Толи хочет много фич и быстро. Напоминает про подход в компании «Business First» (= деньги главное, остальные подстроятся). От этого сроки у задач ставятся авторитарно, нереальные. Можно бы делать проще и быстрее (говно), но потом и сам вляпаешься, и все равно будет овертайм. В отпуск меня никто не отпустит, он уже с августа сдвигается. Ко всем задачам начинается придирки и дописывание правок, чтобы я ничего не доделал и не закрыл. Напрямую проговариваются следующие мысли:

Марианна: «Ты кранчишь потому что ты кранчишь. Делай проще и быстрее»
Марианна: «Если ты не можешь сделать такие простые вещи быстро, значит ты джун»
Толя: «Надо пересмотреть твою зарплату. На лида ты не тянешь»
Толя: «А почему у тебя в день задач часов на 5-6? Рабочих же 8. И вообще ты раньше по 10 работал. У нас все ок, кранчей же нет»


Так прошло два «новых» спринта на которых я получал кучу задач, естественно выходил за оценки и получал кучу криков и наездов на ретро.

Понимаю следующее. Деньги у Толи кончились. Я для него стал очень дорог и не нужен – писать говно и кранчить не же не соглашаюсь. Очевидных косяков нет, поэтому перегружают задачами и уже откровенно наезжают, чтобы сломался и ушел. CEO давит сверху, а CTO и CPO/PM ничего ему сказать не могут, а только усугубляют перекос. Тем не менее, в мультиплеере осталось 2-3 карточки с мелкими багами, фичи все готовы. После истории с никнеймами уже не выдерживаю, следующая глава начинается 29 сентября.


The Crossing of the Return Threshold

После таких наездов и от нагрузки вечером 29.09 не могу уснуть: паническая атака, озноб, ОРВИ. Всю ночь не сплю, с утра немного пришел в себя и написал Толе:

Теперь уже без вариантов – восстановление, отпуск. Две недели точно, но наверное месяц. Но все еще наивно надеюсь восстановиться и вернуться. Должна быть компенсация за кранч (овертаймы кстати не оплачивались до сих пор), обсуждение процессов и нагрузки.

Вечером приходит чуть ли не радостное «Поправляйся. Ты уволен» (он потом отредактировал сообщение). В 22:14, до сообщения убирают доступ в гит и выгоняют из слака. 12 Октября – Марианна вспоминает про Unity Team, к середине октября Оля разобралась как удалить из календаря и рассылки.

Дальше переписка с Толей в телеграме (скрины). Вот краткое содержание:

Долги по зарплате отдаст по частям, пока не придумал когда. Оплату за сентябрь пересматривает в ставку джуна задним числом. В счет долга оставляет у меня старый рабочий макбук за 96000. Отпускные и прочее – вообще не упомянуты.

Я от таких щедрых предложений и решений офигел, но ругаться не хотел – здоровье дороже. Предлагаю два варианта. Пусть по его расчетам, но мак я верну почтой. Деньги пусть переводит все. Либо если хочет продать макбук – остаток мне на карту и мы расстаемся сегодня же. Дальше начинаются споры и манипуляции. Толин план: я получаю 3 частями деньги до 30.10, 10.11 и 20.11. Окей, жду. Когда все выплатит – отправлю мак обратно.

Сроки постоянно сдвигаются, на 21.11 я не получил даже первую часть, только завтраки. Причины и оправдания – на скринах переписки.

Команде первая выплата приходит в срок, к 30.10. От второй примерено 50% к 15-16.11. Все это время в студии работает и оплачивается outstaff middle unity developer. Стоимость имаджинировали? По последнему сообщению Толи, он якобы всем деньги отправил (19.11, 2ая часть), а как до меня очередь дошла – Тинькофф сломался. Так что все Толины обещания и отговорки – вранье. Тем кто на него сейчас работает он долги закрывает, а меня раз получилось уволилить – решил кинуть. Между сообщениями с завтраками были наезды, мол сам виноват и весь сентябрь ничего не делал. В конце – открытое глумление.

Судя по AppStore версия с мультиплеером (5.0.0) которая так горела не особо то и нужна. По истории версий добавилось 8 билдов с мелкими правками и маркетингом. 4.1.11 собирал еще я. Фичи никто не пилит, гонят органику, тюнят воронку. Как всегда инвестиции и revenue остается в штатах на маркетинг, а на разработку тратят только то что в России зарабатывает ИП. Не охотно, и если зарабатывает. А на тех кого уволили ничего не тратят, даже если давно должны.

Расчеты как не крути - не в мою пользу. Но надеюсь договориться быстро и без ругани
Ну раз не хочешь спорить, можем и не спорить))0) Тогда я тебе и письмо не должен
Не получилось
Деняг нет, завтра отдам. Вышли мак пожавуста
Деняг нет
Деняг нет, точно не знаю когда будут
Деняг нет и вообще ты весь сентябрь не работал а нас послылал
У меня есть кое-что получше выплат. Roadmap выплат!


Report Page