Философия разработки // ulkosaurus_hex – Telegram
Философия разработки // ulkosaurus_hex
89 subscribers
10 photos
8 links
Всем привет! Меня зовут Никита Улько, и я посвятил себя интересному и важному ремеслу - архитектуре ПО.

Techlead VK 🚀
Архитектор Friflex 🐼

Предлагаю вам разделить со мной этот сложный путь, учиться новому вместе и просто обсуждать злободневное.
Download Telegram
Зачем прописывать требования для ПО? 📝

Вопрос, которым задаются многие опытные разработчики. А самые опытные не задаются - а просто ищут новую работу 😁

Я видел множество команд и систем, где правила работы этой самой системы не были высечены в камне. Обычно в таких командах присутствуют так называемые "старожилы", которые знают зачем эта система нужна, и что при смене тарифа нужно отправить три уведомления, но только если пользователь из Краснодарского края, и списать бонусы только со второго платежа. Или все таки с первого? 🤔

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

Без прописанных требований: 🚫
1. Мы не можем нормально заниматься проектированием.
2. Мы не можем доказать правильность работы нашей системы.
3. Невозможным становится рефакторинг. Так как у нас, скорее всего, нет тестов.
4. Мы вынуждены постоянно драться за время "старожилов".
5. Сами "старожилы" могут начать противоречить друг другу или сами себе. Такая вот штука - человеческая память.
6. Сами "старожилы" занимаются транслированием своей мудрости, а не задачами. Прописанные требования делают это почти бесплатно.
7. Команда становится зависимой от конкретных людей, создавая риски.

С прописанными требованиям:
1. Мы можем быть уверены в завтрашнем дне.
2. Мы знаем что строим.
3. Мы знаем - как это улучшить.

Что делать? 🛠
1. Собрать заинтересованных лиц и описать проблему. Обычно это менеджер проекта, тимлид.
2. Построить карту местности. Разбейте вашу систему на функциональные блоки (не микросервисы!)
3. Составить роадмап. Соберите все функциональные блоки в таблицу. Назначьте виноватых ответственных. Разбейте по командам, если необходимо.
4. Планировать. Поставьте короткую регулярную встречу (примерно раз в месяц), на которой вы будете делиться успехами за прошедший месяц, и планировать работы по документированию требований на месяц грядущий.
5. Контролировать. Пропишите гайдлайн - что вы хотите видеть в требованиях? Настройте кросс-ревью между аналитиками. Начните с совместных ревью сессий, постепенно замыкая процесс на аналитиков. Приходите в гости время от времени. Вам будут рады! (но это не точно 😄)

Высечены ли в камне требования вашей системы? ⛏️
🙏6🤝2👍1
На прошлой неделе резлинулся очередной подкаст со мной на GetAnalyst. Пообщались с Катей на тему наблюдаемости систем 🔍
Внутри есть конкретный запускаемый пример с OpenTelemetry, который можно посмотреть и потрогать.

В тестовом режиме можно запускать на небольших проектах и MVP "как есть" и сразу стать выгодополучателем. А выгодополучателем быть - всегда приятно.
🔥3
📊 5 метрик мониторинга, которые решают 80% проблем 📊

Для многих аналитиков и разработчиков нефункциональные требования к системе — тёмный лес. Понятно, что «система должна работать быстро и надёжно», но вот какие именно цифры написать в ТЗ, какие метрики указать и как всё это потом проверять — часто остаётся загадкой.

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

🔗 Статья к эпизоду


В эпизоде разбираем:
что именно нужно мониторить на проекте,
какие инструменты обычно настраивают,
какие конкретные метрики и показатели можно и нужно писать в ТЗ.

После выпуска у вас будет структурированное понимание, какие цифры писать в НФТ и как измерять качество системы, а не просто «надеяться, что всё ок» 🙌


Эпизод доступен в:
Apple Podcast
Яндекс.Музыка
Telegram
Castbox
Звук
Spotify
RuTube
YouTube
VK Video


📚 База знаний GetAnalyst - здесь вы найдёте более 100 примеров задач, схем архитектуры и диаграмм. Всё самое важное для системных аналитиков и архитекторов!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4🙏1
Ускоряет ли AI разработку?

Недавно попалась интересная статья на ResearchGate под названием «Измеряем влияние AI на производительность опытных open-source-разработчиков в начале 2025 года». Результаты исследования оказались довольно неожиданными и идут вразрез с общепринятыми представлениями. Оказалось, что хотя разработчики ожидали увеличения скорости своей работы примерно на четверть (24%), реальная картина оказалась противоположной: продуктивность снизилась почти на одну пятую (19%).

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

Размышления самих разработчиков также вызывают интерес:
1. Проверка результатов: даже несмотря на обещания ускорить процесс, проверка выводов ИИ занимает значительное количество времени. Разработчики отмечают, что после достижения определенного уровня мастерства собственные ограничения становятся менее значимым фактором.
2. Освоение новых технологий: инструменты на основе ИИ удобны именно тогда, когда изучаешь незнакомые технологии. Возможность быстро получить образец рабочего кода помогает быстрее разобраться в деталях и существенно сократить время изучения материала.
3. Обучение работе с инструментом: важно осознавать, что AI является лишь одним из инструментов, который необходимо освоить и правильно применять. Без понимания границ его возможностей ожидаемого эффекта достичь сложно.

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

Большое спасибо Артёму (@zxchlorka) за наводку на такую увлекательную тему!
LLM в работе 😡

Лёша Грудин (Team Lead WB, и просто хороший знакомый коллега по цеху) рассуждает на тему эффективности использования LLM в разработке. Забавно, что на этих данных в реальности все оказалось медленнее чем писать ручками. Неожиданный результат. А с другой стороны - даже слишком ожидаемый 😁

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

Быстрое прототипирование, тестирование гипотез - все это делается в такие сроки, в которые раньше было просто невозможно уложиться. Теперь можно протестировать 3-4 варианта выполнения какого-либо функционала по цене 1.

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

Самое ценное, с моей точки зрения - это возможность обучения при помощи ИИ.

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

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

Хотите посмотреть, как выглядят декораторы в чистом Си, но не можете их себе представить? А LLM может. Хотите понять - как работают прерывания в ОС? Вы можете получить ответы на многие свои вопросы за минуты. Раньше - вам бы пришлось проглотить несколько разных книг, и пообщаться с несколькими умными людьми.

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

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

Лично я чаще всего использую Deepseek. И надеюсь, что партия Китай гордится 🇨🇳.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👏2🔥1😱1
За иллюминатором дождь

А это значит, что я лечу в Екатеринбург штурмовать яндексовый pytup 😈

Буду рассказывать про чистую архитектуру (без кругов, воды, и кругов на воде)

На странице конференции появится трансляция для всех желающих

Приходите послушать, если интересно 😉
👏8👍5
Back to the future
🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
Небольшой бекстейдж 😄
Forwarded from VK Tech Team
This media is not supported in your browser
VIEW IN TELEGRAM
🔥8
Философия разработки // ulkosaurus_hex pinned «👋 Приветствую, бойцы цифрового фронта (и, что немаловажно, бэка)! Давайте еще раз познакомимся. Меня зовут Никита Улько, и я рад приветствовать вас в этом пространстве для мыслящих разработчиков, лидов и всех, кому не безразлично - как и что мы создаем.…»
От "Сегодня мы будем делиться нашими лучшими практиками разработки" до "Почему бы нам не засунуть ядерную субмарину в космос?"

Лучший способ описать прошедший Pytup 2025 💻

Было очень круто подискутировать на тему архитектуры. Я, конечно, не ожидал такого количества вопросов от вас, и такое количество вопросов еще раз доказывает важность и злободневность этой темы 😁

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

Отдельно хотелось отметить доклад Егора Гордовского - было интересно послушать про внутреннее устройство ДЦ, и про людей, которые позволяют нашим микросервисам запускаться. Кинетические ИБП с вращающимся блином - это неочевидно, странно и брутально. Не знал, что такое вообще существует в реальности.

На докладе Егора также поднимались интересные вопросы, которые обсуждались и кулуарно. Говорили и про перегрев ДЦ в космосе - пришли к тому, что это, скорее всего, будет очень дорого, поскольку отводить тепло можно только излучением (здесь и всплыла аналогия с мысленным экспериментом про ядерную субмарину в таких же условиях, спойлер - ядерные реакторы в космосе тяжело охлаждать 😄).

И вот тут был заметен резкий переход между темами, которые обсуждались. Сначала мы говорили про архитектуру, потом про ДЦ, а потом вообще про все что только можно (даже за пределами непосредственно разработки - про космос, про технологии в целом, про законы и немного - про философию). И я сам для себя вынес много нового и интересного. Пещерные (буквально, они в пещере, Карл!) ДЦ посреди норвежских фьордов - еще один пример того, что реально существует в этом мире, а ты - даже не подозреваешь.

Хочется выразить благодарность организаторам за то, что сделали все это возможным. А также - Егору и Арсению за интересные доклады.

И, конечно же, большое спасибо вам, за интересные вопросы и кулуарные обсуждения!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥152🙏2
Как ускорить сервис на FastAPI практически бесплатно

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

Представьте, что у вас есть сервис, который куда-то ходит по HTTP. Так или иначе по HTTP мы все постоянно куда-то ходим за редкими исключениями.

В нашем примере - мы ходим за расширенной моделькой продуктов с остатками. А остатки - в отдельном микросервисе.

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

Напрашивается вывод - проблема за пределами нашего скоупа. Библиотеку написали криво; фреймворк надо менять; опять нам какой-то проклятый сервак с кривой сеткой достался, нашли на чем экономить.

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

Выглядит наш огород примерно вот так:
@app.get("/product/{product_id}")
async def get_product(product_id: int, db: Session = Depends(get_db)):
query = select(products).where(
products.c.id == product_id
)
result = await db.execute(query)
product = result.first()

async with httpx.AsyncClient() as client:
response = await client.get(f'хттп://сервис_остатков/получить_остатки/{product_id}')

# Героическая склейка всего и вся

return result


Допустим, сервис остатков мы написали относительно хорошо. Он отдает остатки по конкретному id за 30 миллисекунд в 99 перцентиле. Попросить одну запись по id из БД нам будет стоить 10 миллисекунд. Ну и, предположим, еще 10 миллисекунд скушает фреймворк.

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

В абсолютных цифрах - это может и не много. Но не в нашем же случае! Время затрачиваемое на полезную работу у нас - от 50% до 33%. То есть половину или две трети времени мы занимаемся непонятно чем.

Подрубив профайлер, мы обнаружим - все наши операции действительно в пределах 40 миллисекунд (не считая фреймворк). Но перед отправкой запроса по HTTP мы видим какой-то пробел во времени. Если измерим чуть точнее, то увидим, что это время съедает контекстный менеджер, который создает клиент httpx.

Нередко можно встретить вот такой утиль:
async def fetch_data(url: str) -> Dict[str, Any]:
"""Утиль для получения данных из другого сервиса"""

async with httpx.AsyncClient() as client:
### Богоподобная обработка ошибок и таймауты!
return result


И этот утиль потом используется во всех запросах. Удобно же, когда ошибки обрабатываются в одном месте? И сразу с таймаутами. Намерения благие. Но ими выложена дорога в ад. В таких ситуациях мы будем терять от 50 до 100 миллисекунд на каждый запрос. В сервисах, которые часто куда-то ходят по HTTP - это катастрофа.

Что же делать?

В нашем случае нужно создавать клиент httpx точно таким же образом, как мы создаем коннект к БД. Создавать клиент один раз в lifespan. И прокидывать готовый клиент как зависимость в другие компоненты (или например сразу в роут). И тогда сможем избежать дополнительных затрат по времени. И еще получить дополнительное ускорение за счет пулинга HTTP соединений.

Чего ждать?

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

Мораль?

Мораль очень проста - все подобные ситуации лишний раз говорят нам о том, насколько важно правильно управлять зависимостями и их жизненным циклом. И не позволять туннельному зрению брать верх над собой - посматривать иногда на вещи глобально, с высоты птичьего полета 🦅
🔥9👍2😁1
Книжный биатлон

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

Для меня все изменилось на CrossConf 2024. Я поставил себе установку задавать максимально сложный вопрос, насколько это только возможно. На каждом докладе, независимо от его релевантности. Это стало моей целью нахождения в аудитории. Я записывал вопросы по мере выступления докладчика. Стирал, снова записывал - уже более интересные.

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

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

На фото - улов со вчерашнего Team Lead Today. Как и на многих конфах - давали книжку за лучший вопрос. Мне повезло - я выбил три, одну из которых сразу же подарил, так как выпал дубль 😁

Про саму конфу расскажу подробнее чуть позже. Было много интересных и полезных докладов. Уже применяю новые знания на практике, и скоро ими с вами поделюсь. А нескоро - поделюсь тем, что из этого по итогу вышло.
👍6🔥1
Архитектура, которая предотвращает проблемы, а не
реагирует на них
🚀

Доклад Алексея Грудина (TeamLead GO в WB&Russ), который среди всех на конференции мне понравился больше всего.

Разработка и сопровождение информационных систем сопряжены с постоянными рисками - авариями, инцидентами, устареванием технологий. В своем докладе Алексей рассказал про свою систему - как он борется с рисками в проекте для которого минуты простоя эквивалентны потерянным миллионам рублей для заказчика 📉

Основная идея в том, чтобы действовать проактивно. Не реагировать на внешние раздражители вращаясь в бесконечном цикле тушения пожаров, а инициировать изменения - создавать условия для того, чтобы эти пожары стали физически невозможными. Лучшая защита от рисков - это нападение ⚔️

Шаг 1 - построить карту местности 🗺

Понимание проблемы - первый шаг к ее решению. Здесь мы выделяем время на брейншторм. Нам потребуется примерно полтора часа. Собираем всех разработчиков вместе и запасаемся большим количеством стикеров (ну или большой табличкой в вашей wiki). Цель встречи - собрать как можно больше стикеров с рисками, как можно больше информации. Не критикуем, не убираем стикеры, которые могут частично дублировать другие.

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

Шаг 2 - приоритезировать ☝️

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

Для того, чтобы заполнить колонки - мы снова зовем разработчиков и производим акт демократии. А именно - коллективного голосования за каждый стикер в таблице. Каждый участник в закрытую тянет одну карточку (низкий риск/средний риск/высокий риск/критический риск). После чего все карточки собираются и подсчитывается их среднее значение.

Таким образом заполняется вся таблица. На эту встречу можно выделить 30-60 минут.

Шаг 3 - планировать, выполнить, повторить 🔁

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

Таким образом мы получаем систему, в которой мы видим риски, и можем ими управлять. У нас все карты на руках для того, чтобы пожар не случился.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍2
Дорогие подписчики! Поздравляю вас с наступающим (а кого-то - с уже наступившим) Новым Годом! ❄️

В уходящем году было немало как вызовов, так и интересных и классных событий. В частности - появилось наше с вами ламповое сообщество. За что хотелось бы сказать вам большое спасибо! Именно благодаря вам оно стало возможным. Спасибо, что приходите со своими мыслями, вопросами и темами для обсуждения, делитесь своим опытом, даете обратную связь по контенту и идеи для новых постов.

В Новом Году хочется сделать акцент именно на вашем опыте. Написать про ваши истории успеха и ваши победы над инцидентами и техническим долгом.

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

Желаю вам зелёных пайплайнов и зелёных ёлок 🎄! Счастья, добра, безудержного роста во всём! 🎉
👍7🎉5🙏1
Как узнать вес коровы?

Один из рабочих способов - взять 800 человек, показать каждому одну и ту же корову. Попросить прикинуть вес коровы "на глаз". Записать ответ каждого респондента в книжечку и посчитать среднее.

Именно так и поступил сэр Фрэнсис Гальтон в 1906 году, проводя эксперимент с целью доказать, что мнение эксперта важнее и более правильно, нежели мнение менее опытного большинства. И доказал ровно обратное, открыв эффект под названием "мудрость толпы".

Тогда 800 человек не просто угадали лучше эксперта (мясника) - они угадали с точностью какую только могли гарантировать весы того времени. Ошибка составила всего 0.08%. Толпа ошиблась на 1 фунт.

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

1. Независимость ответов респондентов. Если респонденты знают ответы друг друга - они начинают корректировать свои оценки и вся мудрость улетучивается .

2. Отсутствие предвзятости. Если респонденты слишком похожи друг на друга и уверовали в одно и то же - то их ответы (и вся картина в целом) будут искажены в сторону того, во что они уверовали.

3. Хотя бы какая-нибудь экспертность. Если респонденты выдают абсолютно случайные ответы - мудрость также улетучивается. Зато их можно использовать как идеальные ГСЧ (везде есть свои плюсы).

Именно на эффекте мудрости толпы базируется покер планирования, который мы используем для угадывания ответа на невозможный вопрос "сколько тасочка займет по времени?"

Совсем скоро расскажу - как и что мы угадываем (на покере и не только), а также - что не угадываем, но хотим попробовать угадать.

А пока предлагаю посмотреть - что угадывают другие люди, и насколько хорошо у них это получается - https://www.metaculus.com/.
9🤯2
🎯 Покер планирования

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


📋 Для начала - предусловия:

1️⃣ У вас есть некоторый бэклог с тасками, где они лежат без оценки, но уже с детальным описанием.
2️⃣ Вы собираетесь на фиксированный слот по времени (30-45 минут).

🃏 Теперь что касается самого процесса:

Карточки - лучше взять последовательность Фибоначчи, поскольку вы мыслите категориями, а не цифрами. Для выбора каждой конкретной карточки есть причина - и большая разница. Ошибиться сильно сложнее.
➡️ Когнитивная нагрузка - меньше, времени на сам процесс уходит - меньше, оцененных задач - больше. Более того - большие числа поощряют декомпозицию задач.

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

Проводим повторное голосование (до тех пор, пока не будет достигнут консенсус, либо никто не захочет корректировать свою оценку).

⚠️ Важное замечание: здесь нужно делать акцент на условии №1 (независимость) из прошлого поста. Нужно прокручивать всю задачу в голове с самого начала, но с учетом новой информации. Но максимально пресекать желание сделать оценку чуть ближе к среднему "просто потому что".

Не менее важно делать акцент на условиях №2 и №3, но обычно они удовлетворяются тем, что карточки тянут только непосредственно разработчики и тимлиды.

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

📊 Story Points (SP) - что это и зачем?

Обычно говорят, что задачи оцениваются в story points (SP) - и здесь в каждой команде может быть вообще своя кухня.
Что такое SP? Что они значат? Часто бывает, что у всех - по-разному. У кого-то - это часы. У кого-то - другая метрика.
🎯 Но ценность SP не в том, чтобы что-то значить «в вакууме». А в том, чтобы сортировать задачи по сложности. И чтобы понимать, что одна задача - в 2 раза сложнее другой. Или в 10 раз сложнее. То есть сами SP не значат ровным счетом ничего.


📈 Как калиброваться? Velocity команды

Чтобы понять, что такое SP в вашем конкретном случае - нужно провести пару-тройку калибровочных спринтов.
Записать все задачи, которые реально были сделаны, и просуммировать их SP. После чего - рассчитать среднее за эти 2-3 недели.
Вы получите velocity вашей команды. Теперь вы можете с высокой долей вероятности сказать, что взяв бизнес-задач на 80 SP - вы их закроете без форс-мажоров. Потому что velocity вашей команды, например, 105 SP за спринт. А оставшиеся 25 SP можно забить техническим долгом.

💡 Важно помнить: velocity команды может меняться со временем. Поэтому лучше считать её с некоторой регулярностью, основываясь на данных за последние несколько спринтов.

🛠 Если в вашем трекере нет встроенного инструмента для покера и вы не хотите тратиться на платные сервисы - ловите отличный Open Source инструмент для покера:

hellomuthu23/planning-poker on GitHub ⚙️

Можно развернуть у себя за пару минут или использовать сразу развернутый по ссылке в репозитории.
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Демократичный способ управления техдолгом

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

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

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

Но часто так бывает - что этих болей все равно много. Что-то стреляет сейчас, что-то пока не стреляет, но стреляло раньше, и про это не говорят. Глаза могут разъезжаться.

Более того - составили мы роадмап, например, на Q2. Но где гарантия, что все из этого сделаем? А если прилетит что-то горячее? А если горячее прилетит 2-3 раза подряд? Пересматривать наши наполеоновские планы?

Ответ вижу как раз таки - в коллективном угадывании. И в краткосрочном планировании.

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

Ранее мы уже говорили про управление рисками на примере доклада Алексея Грудина из WB&Russ. Мы использовали приоритезацию рисков. Здесь мы поступим похожим образом, но применительно не к рискам, а к уже имющимся проблемам, с которыми тоже нужно системно бороться.

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

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

Можно прикидывать "в уме" соотношение этих трех параметров. Можно отдельно оценивать все три параметра по пятибалльной шкале и считать итоговое значение приоритета по формуле. Например - серьезность риска * вероятность реализации / трудоемкость.

Тем не менее - большими мазками наполеоновские планы строить можно и даже нужно. Но на тактической карте - оперировать тем что имеем "здесь и сейчас".

И важно оставлять себе как руководителю немного диктатуры в виде права вето или пары-тройки строчек, которые идут без очереди. Потому что команда сможет помочь с тактикой. Но стратегия - лежит исключительно на плечах тимлида, как и ответственность за нее.
4👾2