Продакты всегда платят свои долги

Продакты всегда платят свои долги

Источник: https://exp.fm/posts/152

 — вопрос, который однажды слышит каждый продакт и ситуация, в которую попадает каждый продукт.

Разберемся, почему до определенного момента в этом ничего страшного, что случается когда это наступает, и как действовать в совсем критических ситуациях.

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

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

Тем самым, построенное когда-либо на скорую руку кривое решение, с ростом продукта/базы, начинает обрастать большими связями и условиями, которые могут строиться на кривом решении.

И раз он строится на хлипкой архитектуре и логике, то, по теории вероятности, однажды всё это начнет работать НЕ КАК НУЖНО, а как... позволяют ограниченные убивающие возможности.

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

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

Я для себя выделяю три вида тех. долга:

№1. Допустимый или осознанный долг

Когда объем тех. задолженности ещё ни на что не влияет и его можно довольно быстро ликвидировать в течение допустимого для команды/бизнеса периода времени, которая ещё осознает.

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

№2. Нарастающий тех. долг

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

Объем задолженности уже начинает сказываться на реализуемых вариантах тех. решений пока еще в виде фраз "именно так сделать ___ не получится, потому что у нас ___, но можем сделать по другому".

И да, это делается, работает, но технически решение сильно привязано к тому самому начальному костылю.

Далее уже две, три... пятнадцать пользовательских фич (кода), надстроены над кривым решением и жестко привязаны к нему и ⇒ ограничены на уровне функциональных возможностей кода ⇒ ограничивают UX/UI-механики ⇒ ограничивают продукт и его рост.

Уже на этой стадии нужно задуматься над будущим и трезво оценить возможные риски (писал о рисках здесь) и если текущий статус развития продукта и планы на ближайшее будущее позволяют взять 1-2-3 месяца на рефакторинг, то, скорее всего, это нужно сделать.

№3. Критический или невозвратный долг

То, к чему, в конечном счете, однажды и можно придти. Объем задолженности уже такой, что бэклог чаще окрашен в красный цвет баг-репортов, а каждая новая строчка фикс-кода порождает еще 2 строки ошибок (в лучшем случае) или роняет систему уже на новой ошибке в по-прежнему кривой логике разросшегося с годами кода.

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

Посмотрите на Skype, Google, Facebook. Их ключевые продукты генерят деньги, но... стоят в развитии на месте. Они тормозят, в них иногда мелькают элементы из дизайна 2000-ых, они не гибкие, в них крайне громооздкое API по одной простой причине

— в приоритете поддержка текущей работоспособности и рефакторинг быстро стареющего кода и обновляющихся интерфейсов и механик/фич.

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

Но, в конечном счете, такие стартапы всё равно будут поглощены и встроены в сложные системы гиганта :)

Facebook и Instagram

Советы по уменьшению тех. долга

Если серьезных долгов нет, то задача продакта — удерживать себя, продукт и команду в рамках осознанного технического долга, объективно понимая, когда те или иные костыли уместны, полезны и помогают выиграть вам и продукту время, а когда станут бомбой отложенного действия.

Думай на будущее

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

Думай о гибкости его применения пользователями, анализируй контекст в котором они используют продукт и не бойся думать о том, для чего еще они могут его применить (общие и частные user cases).

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

Статья про масштабированиеhttps://exp.fm/posts/83.

Сообщай команде о будущем

Фраза, которую должен использовать каждый продукт-менеджер в постановке задач для команды разработки на новые фичи в продукте: "Разработать с учётом _____".

Работает просто — если вы ставите задачу на разработку новой фичи и вы, как PM, понимаете, что она по механике связана или может быть в ближайшем времени связана с другими (и возможно даже какими-либо ожидаемыми фичами в продукте), то не поленитесь лишний раз обратить внимание ваших ребят из разработки на это.

Тем самым вы снизите вероятность того, что они запилят что-то строго по задаче, что будет работать сейчас, но потенциально плохо с будущими разработками которые еще у вас в голове/далёких сторис.

Дружи с тем, кто отвечает за архитектуру и логику

Потому что это именно тот человек, кто и будет отвечает за то, как в конечном счете будет реализована фича или временный костыль.

Проговори с ним языком пользовательских кейсов о том, как должна работать фича/костыль сейчас/в идеале/в будущем.

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

Объясняя на конкретных примерах ты рисуешь в своей и их голове более ясную картину, которая далее и воплощается в пользовательских механиках и, как следствии, более красивой и понятной всем логике кода.

Документируйте пользовательскую логику и код

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



Что делать если уже встряли?

Признайте болезнь

Всё как в медицине — если болезнь мешает жить и развиваться, то нужно признать факт болезни и согласиться на её дальнейшее лечение.

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

Придется усиленно попотеть с СТО и командой за разработкой полноценного плана действий, который можно условно разбить на следующие этапы:

  1. Ставим цели по задолженностям: "Сократить время загрузки страницы ___ до 1 секунды → Ждем рост польз. действий ____", "Рефакторинг для запуска API → х2 подключенных к API клиентов" и т.п.
  2. Документирование. Перво-наперво (и самое главное), нужно собрать реальную картину с архитектурой и логикой того, что вы с командой решили оптимизировать. Придется чекать код, попутно проверяя его работу на продакшене, вспоминая на практике "а как у нас всё работает ___" 🙂 Советую описывать это как полноценные пользовательские мини-кейсы, чтобы в новой версии их можно было быстрее найти, воспроизвести и проверить.
  3. Аналитика. Собрав всю инфу и прогнав её на кейсах, смотрим заново/с нуля на свой продукт как конечный инструмент для пользователя, изучая его слабые стороны, анализируя возможные причины и их связь между собой и предлагая варианты по улучшению выявленных проблемных мест.
  4. Планирование. Переосмысляем инфу, выбираем новые подходящие варианты без конфликтов с чем либо, обновляя сторис и механику работы фичи/кода.
  5. Реализация. Отдельные спринты, переформированная команда, отдельная ветка — думаю, программисты и без нас знают что и как там делать.
  6. Тесты и проверка. Без них никуда и тут снова пригодятся мини-кейсы из пункта №2. Смотрим старые механики, находим, прогоняем, сравниваем с новыми.
  7. Пост-аналитика. Смотрим в цифры и метрики из №1, сравниваем с собственными ощущениями. Если что-то не так, начинаем с №4.

Повторюсь, что многие этапы и моменты связаны именно с ребятами из команды разработки, которым больше виднее, как планировать и проводить рефакторинг кода. Задача продакта – дать как можно больше информации о том, как применяется и может применяться пользователями ваш продукт.

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



Report Page