Как стать автором
Обновить

Релизы без выгорания и овертаймов: как мы меняли процессы работы над крупными игровыми фичами

Время на прочтение7 мин
Количество просмотров7.4K
Всего голосов 21: ↑20 и ↓1+21
Комментарии15

Комментарии 15

Нас заливало постоянными и неконтролируемыми изменения (добросами) в дизайне фичи. В работе рождались новые идеи и допилы. Мы брались за все изменения без какого-либо анализа...

А аналитика у вас нет? Бизнес-идеи вбрасываются непосредственно в разработку?

У нас есть аналитики, но они продуктовые и сфокусированы на метриках продукта.
Про идеи - тут нужно понимать, что допилы/добросы могут быть как по дизайну, так и технические. Изменение дизайна сначала обсуждались Гейм Дизайнерами (+ иногда с привлечением Продюсера/Аналитиков или других отделов) и потом вкидывались непосредственно в команду. Технические задачи генерит сама команда разработки (например, сделать рефакторинг). Зачастую и те, и другие изменения не являются критичными для первого релиза фичи, поэтому их всегда можно отложить на будущее.

Забыл поворчать в пятницу - поворчу сейчас. Вы все сделали совершенно правильно, вот только такие статьи - не обижайтесь, сам хожу по этим граблям - напоминают построение велосипедов. Методологии построения работы, лучшие практики и пр. давно уже разработаны и описаны, осталось их применять (где-то допиливая по месту). У вас есть системные аналитики, просто по факту их роль играет разработка. Соответственно, все, что Вы сделали - заставили разработчиков эту роль правильно играть. И вот когда они стали фильтровать все входящие свистелки и хотелки, обсуждать их с соседскими командами, смотреть на объявленные ранее сроки и т.д. - а это все как раз работа системного аналитика - "Вот тут-то мне карта и попёрла!". И да, если документация идет как часть выходных артефактов, то и время на нее должно закладываться, как и на прочую работу.

Да, мы, безусловно, берем в основу известные методологии разработки - куда без этого) Но реализация этих методологий на практике всегда разная. Зачастую все команды встречаются с одинаковыми проблемы, но решение у всех своё. Не зря же на Ретро поднимаются и обсуждают сложные кейсы. Команда вправе сама решать - как им изменять и улучшать процессы... и это нормально. Поэтому у всех свой прекрасный велосипед , который в основе имеет один и тот же механизм работы (методологию)) Я пришла к выводу, что велосипеды неизбежны и одного красивого масштабного решения нет ... как только приняла это, стало намного проще в работе применять простые (но эффективные) решения. А в этой статье решила поделиться именно практикой, а не писать лекцию - какой плохой или хороший Agile/Waterfall)
  Затрону еще вопрос с Системным аналитиком - считаю, что в рамках Enterprise это полезная роль, но в GameDev есть особенность работы - фича - это не бизнес-процесс, который мы автоматизируем, правим или заново выстраиваем. У нас дизайн игровых фичей, точные результаты успешности фичи мы получаем только с реальных данных, т.е. покупают игроки в игре что-то или нет) Поэтому над определением дизайна работают много людей - это и Гейм Дизайнер, Продюсер, Аналитики, отдел Монетизации и т.д. Если бы был кто-то 1 , кто точно знал - как оптимально делать, то мы бы с радостью забрали такого человека в команду) В нашем случае мы не перекладываем решение по дизайну на разработку, мы лишь обсуждаем всей командой - насколько изменение критично для нашего релиза, нам важно услышать мнение специалистов в своей сфере и взять полезный от них фидбэк)

Привет бывшим коллегам,

>Обсуждаем все изменения в дизайне фичи в открытых Slack-каналах

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

Привет))
Плюсую) удаленка прям подтолкнула вести общение максимально открыто на всех... теперь не получится услышать новости на кухне во время обеда) Слак стал практически всем миром))))

Расскажите подробней про Capacity и Complexity

На основе чего вы рассчитываете Capacity команды? Вы ведете time sheets или что-то более простое для учета времени, потраченного на задачи? Просто считаете количество задач (тогда как вы суммируете задачи разных размеров)? Заранее оцениваете в "не-временнЫх" единицах вроде "берем идеальную задачу и сравниваем остальные с ней - такая же, дольше, проще" или "прогноза подводных камней - просто, нужно подумать, вообще не понятно" (а есть переоценка во время work in progress)?

Как вы измеряете Complexity? Эти единицы можно складывать? Как они сопоставляются с Capacity?

Как считаем Complexity - это сумма Оценок задач в Эпике. Задачи мы оцениваем в Story Point. Оценку дает команда разработки целиком (у нас есть разбиение на клиентских и серверных разработчиков, они оценивают по-отдельности) через Покер планирование. Так сложилось, что 0.5SP у нас выливается в 1 день разработки, 1SP - 1.5-2 дня, 2 SP - 4-5 дней (сейчас меня могут закидать помидорами, потому что SP как бы низя переводить в дни, но мы так делаем))). Есть важное правило - мы не берем в работу задачи с оценкой больше чем в 2 SP, т.к. это как черный ящик, поэтому мы инвестируем доп. время на этапе расписания на проведение RnD, чтобы дать более точные оценки и декомпозировать задачу. Лучше это делать в самом начале, чем в середине разработки понять, что там скрылся рефакторинг на 10SP. Периодически мы проверяем, попадаем ли мы в оценки - через данные в Jira + сравниваем успели мы сделать планируемый скоуп к нужному времени или нет))

Как считаем Capacity - закладываем, что за 2 недели мы делаем 5 Story Point (эта цифра взята из практики, а не из головы). Мы учитываем, в какую дату сможет подключиться каждый из разработчиков, закладываем на каждого разработчика время на отпуск + возможный больничный + риски на возможные изменения в скоупе фичи (это число мы как раз рассчитываем).

Оба числа просто сравниваются и если Complexity>Capacity, то из фичи убираются задачи пока Complexity и Capacity не станут равным.

Спасибо! Хотя я еще вопросов принес :)

  1. Наверняка у вас встречаются ситуации, когда одна задача становится заблокированой на некоторое время (нужно чего-то дождаться, отвлечься на срочное - да тот же отгул на день). Вы как-то учитываете это при проверках "попадаем в оценки или нет"? Сколько суммарно времени может уходить на "задача в работе, но не делается"?

  2. Как много у вас задач-прилетов "все в огне, нужно сделать вчера", не связанных с бэклогом итерации? Какое соотношение между ними и выявленными "подводными камнями" задач в работе, без которых не запуститься?

  3. Также кажется, что у найденного подводного камня есть две судьбы - либо без него вообще нельзя, и на задачу будет потрачено больше времени (и это вы не только закладываете заранее, но и проверяете впоследствии), либо это "можно отложить". Вопрос - есть ли у вас в бэклоге такие фиче- и технические долги? Как вы их приоритизируете относительно новых фич-реквестов, по какому принципу набираете в бэклог итерации?

  4. И есть ли у вас какие-нибудь best practicies и прочие трюки, чтобы сформулировать Definition of Done, с которым все (разработчики и стейкхолдеры) будут иметь в виду одно и то же? (что также должно минимизировать расхождение между прогнозируемой сложностью и фактическими затратами, ведь nice to have, который не подразумевался заранее, можно с чистой совестью отложить или даже выкинуть)

  1. Да, конечно, учитываем. Если человек уходит в отпуск/отгул/заболел, то такие кейсы учитываются в нашем изначальном Capacity команды еще перед стартом разработки, поэтому это не должно сказываться на финальной дате. Если это что-то незапланированное, то у нас всегда есть запас из % рисков. Если уже что-то сверху, мы рассчитываем оставшееся Capacity команды и оставшееся Complexity фичи и снова их сравнивать, главное понимать - сколько будет простаивать задача.
    “Сколько суммарно времени может уходить на “задача в работе, но не делается“? ” - тут не совсем поняла вопрос, можешь раскрыть?

  2. В нашем случае - крупной фичей занимается выделенная команда, мы ее не трогаем совсем и тут могут быть только изменение дизайна/незапланированный рефакторинг/забытый функционал . Но при этом у нас есть еще часть людей , кто может заниматься залетными задачами или другими менее крупными фичами и вот тут мы можем стопать работу менее приоритетной фичи и давать что-то критичное.
    Задачи-прилеты - это всегда вопрос приоритетов для бизнеса. Тут должен задаваться только 1 вопрос - Что для нас важнее на текущий момент? Продюсер/Product Owner должен делать выбор. Сделать сразу 2 задачи и при этом не изменить срок готовности или не увеличить состав команды - так не получится) Поэтому для нас залетные задачи - это только те, что могут полностью заблокировать работу игры на проде. Например, упали серваки - естественно, это становится приоритетом №1 в работе команды.

  3. Технический долг, естественно, есть) Каждый спринт мы выделяем у команды разработки 5%-10% их времени на техдолг (это просто волевое решение)). Если есть что-то крупное и важное, что требует длительной активной разработки, то мы выделяем прям как фичу и эта фича лежит в нашем продуктовом бэклоге и у нее есть ценность для бизнеса в том числе. Мы понимаем, что забить на техдолг нельзя... иначе продукту в определенный момент будет очень плохо)

  4. У нас нет внешних стейкхолдеров, только заказчик в лице Продюсера или Геймдизайре, которые находятся внутри команды. Пока мы обходимся без формализованного процесса составления DoD. Но нам помогает быть на одной волне - хорошая атмосфера в команде, плотный контакт и нацеленность на единый результат. Все друг другу помогают, готовы ответить на вопросы. Мы часто показываем промежуточные результаты работы и даем фидбэк. В условиях удаленки - обязательно нужны общие синки (обсуждайте вместе все проблемы и задавайте вопросы), максимальная открытость в переписке в каналах (команде должно быть комфортно высказывать свое мнение. привлекайте в обсуждения людей). Пока мы обходимся без формализованного процесса составления DoD

1. Кажется, я замудрил с вопросом, поэтому позволь переобуться на ходу. Как именно вы проверяете, попадаете вы в оценки или нет? Если используете реально затраченное время - откуда его берете и как обеспечиваете его адекватность?

Немного контекста моего интереса. У нас есть проблемы а-ля "недожарили задачу, а стейкхолдеры не могут ответить прямщаз" и "делали задачку, и вдруг прод загорелся - отвлеклись на 2-3 дня". Мы пытались помечать unexpected-задачи, чтобы на основе статистики понять процент рисков для такой же "закладки" и отработать их причины - вышло по-бюрократически муторно и не очень точно ¯\_(ツ)_/¯ Например, мы забываем двигать или тегать карточки, таск-трекер не считает, сколько времени задача была в статусе "заблокировано", ну и ситуации бывают куда гибче и хитрее этих ваших процессов и инструментов :)

4. Я не могу не спросить. Бывает такое, что в стремлении сделать как можно лучше разработчики слишком увлекаются "игрой со шрифтами" и в итоге продалбывают какой-нибудь важный кусочек функциональности?

  1. Отвечу по-частям:
    1.1 Сбор статистики - в трекинга всегда грязные данные и их чистить очень сложно. Из Jira я беру только те данные, которые можно быстро почистить. Смена статусов с большой командой - это очень сложно и жестко контролировать точно не получить (будете контролировать - будет гнев команды на вас)) не стоит заставлять)
    Если хотите оценить попадаете ли вы в оценку, то смотрите на больших цифрах.... Предположим, у вас делает 1 итерации весом 50SP всего 1 разработчик - по времени это, например, 50 дней. Когда завершается итерация/фича - вы смотрите в целом, ваши 50SP уложились в 50 дней? Если +/- да, значит в целом всё норм, если 50SP вы сделали за 100 дней - то тут уже явно всё плохо, значит нужно углубляться в детали. Обычно я смотрю меридиану потраченного времени для разных весов задач - 0.5SP/ 1SP/ 2SP/ 3SP. Именно так мы нашли, что задачи на 3SP всегда занимают разное время - от 0.5 дня до 2х недель, поэтому от такого веса мы отказались и декомпозируем.
    1.2. Unexpected-задачи - в моем понимании, это задачи с приоритетом Блокер (т.е. важнее текущая фича и прод без этой задачи просто развалиться) + это всегда неожиданная хрень (для нас, например, это выход idfa - это внешний фактор) + повлиять на появление таких задач практически невозможно. Но тут нужно понимать:
    - если вы постоянно встречаетесь с одной и той же проблемой “прод загорелся ” - это уже не unexpected-задача (при этом причины в проблем прода могут быть всегда разные). Значит, нужно системно бороться с этой проблемой, т.е. выделять время разработки на фиксы (это нужно еще уметь продать вашему product owner, но зачастую продуктовики сами заинтересованы в стабильности своего продукта). Если выделить время на системное решение проблемы не получается, то просто увеличивайте риски при разработке основной итерации. Прям считайте, сколько примерно в среднем времени (не пытайтесь оценить точно ... это тут не нужно) вы тратите каждый раз на тушение пожаров и это время закладывайте в риски.
    - если всё-таки всё, что прилетает это действительно unexpected-задача - то просто закладывайте в риски. Вы не сможете это контролировать факт появления, только вы можете митигировать эту потенциальную проблему, например, заложив это в риски разработки.
    1.3 Заблокированные задачи - нужно понимать частоту появлений и кто-кого блочит. Если это внутри команды - попробуйте на раннем этапе проставить зависимости между задачами, на статусах обсуждать заранее - кто и кого может заблочить по работе и у кого какие планы (тут снова должны быть хорошие коммуникации у команды). Если блокеры со стороны внешних стейкхолдеров и к ним копиться всегда много вопросов - то стоит налаживать контакт с ними... не могут ответить в моменте , значит организуйте чаще с ними мини-созвоны, где можно будет обсудить все вопросы. Если постоянно возникают вопросы, которые можно было задать и на раннем этапе - то пробуйте выделять больше времени при декомпозиции фичи. Это уже проблема не в том, что стейкхолдеры не отвечают, а в том, что разработка не детально расписывает задачи.

  2. Да, такое бывает) Нам помогают синки. Лид/ПМ видит, что человек уже 2 дня делает одну задачу и застрял на одном месте, а должен был уже сдавать в куа - значит, стоит туда капнуть и узнать в чем затык) Возможно человек просто не знает как решить задачку и ему нужна просто помощь) ну или он чем-то увлекся)

Обычно я смотрю меридиану потраченного времени для разных весов задач - 0.5SP/ 1SP/ 2SP/ 3SP

Если я правильно понял, то речь идет о медиане, она же 50th percentile. Физический смысл - "половина задач будет сделана за это или меньшее время". Вам достаточно того, что вы прогнозируете только половину задач? Или вы (вообще кто-то кроме тебя ходит на эти экраны Jira?) проверяете и другие характеристики распределения? Боюсь, я не настолько дружу со статистикой, чтобы что-то предполагать...

Да, речь про медиану) Значение - половина значений находится ниже этого значения, а другая половина находится выше этого значения. Кроме самого значения медианы , важна плотность распределения задач относительно медианы + правильно построенная выборка. Грубо говорят, если бОльшая часть задач находит близко к медиане, то значит оцениваем норм. Если нет и разброс очень большой, то возможно тут проблема и стоит покопать. Очень грубый пример -
1day , 1.5d, 1.9d, 2.1d, 2.2d, 2.3d, 2.5d - распределение норм
1d , 1.5d, 1.9d, 2.1d, 3d, 6d, 9d - распределение не норм

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

Большое спасибо за ответы! Кажется, одно это обсуждение уже тянет на еще одну статью :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий