Новое в журнале. Маленькие pull request: почему их быстрее ревьюят и как резать задачу
Рост и обучение

Оценка задач для разработчика: диапазоны вместо точных чисел

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

9 июня 20268 мин чтенияПрактикам
Оценка задач для разработчика: диапазоны вместо точных чисел
2-3 разатипичная разница между оптимистичной и реалистичной оценкой
3 уровнядекомпозиции хватает для большинства задач

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

Почему точное число почти всегда обманывает

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

Главная мысльОценка в одно число на самом деле обещание, а диапазон честно говорит, чего в задаче ещё не знают.

Диапазон вместо одного числа

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

Тип задачиТипичная ширина диапазонаПочему
Повторяющаяся, похожая на уже сделаннуюузкий, плюс-минус 20%мало неизвестного, есть прямой референс
Новая фича в знакомом кодесредний, в 1.5-2 разакод знаком, детали требований не до конца ясны
Работа с новой библиотекой или внешним APIширокий, в 2-3 разанеизвестны реальные ограничения внешней системы
Задача с нечёткими требованиямиочень широкий или требует уточнения заранееосновной риск не в коде, а в понимании задачи
Если диапазон получается шире, чем в три раза, это сигнал не оценивать задачу вслепую, а сначала потратить немного времени на разведку: прочитать документацию библиотеки, собрать минимальный прототип, уточнить требования у заказчика.

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

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

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

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

Вы в начале разбораДальше: разбор компромиссов, чек-лист и ответы на частые вопросы.

Явный учёт неизвестного

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

Задача: интеграция с внешним API доставки
  - разбор документации и тестовый запрос: 0.5-1 день
  - реализация основного сценария отправки: 1-2 дня
  - обработка ошибок и повторных попыток: 0.5-1 день
  - неизвестное: реальные лимиты API, поведение на проде: 0.5-2 дня
  Итог: 2.5-6 дней

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

Буфер на интеграцию, а не только на код

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

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

Как говорить об оценке с теми, кто просит одно число

Опора на прошлые задачи, а не только на интуицию

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

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

Разница между оценкой разработчика и обязательством перед бизнесом

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

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

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

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

Менеджер или заказчик часто действительно нуждается в одном числе для планирования, и это разумное требование с их стороны. Разработчику стоит не отказываться называть число вовсе, а явно объяснить, какую часть диапазона он называет: нижнюю границу для оптимистичного планирования или верхнюю для надёжного дедлайна, и зафиксировать это словами, а не оставлять на понимание собеседника. Фраза «если всё пойдёт по плану, три дня, но с учётом интеграции и возможных сюрпризов закладывайте пять» работает лучше, чем простое «три дня», даже если собеседник в итоге всё равно запомнит только одно из двух чисел.

Частые вопросы

Как оценивать задачу, если требования ещё не до конца сформулированы?

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

Стоит ли закладывать буфер на отпуска, больничные и другие задачи параллельно?

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

Почему оценка часто занижается даже у опытных разработчиков?

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

Код, который не стыдно передать

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

Случайный разбор