Перейти к основному содержимому

Loaded hourly rate: почему час разработчика стоит в 1.5 раза дороже зарплаты

· 8 мин. чтения
Artur Pan
CTO & Co-Founder at PanDev

Senior backend разработчик в Алматы получает $5 000/мес. gross. CFO, который оценивает новый проект, делает очевидную арифметику: $5 000 ÷ 160 = $31.25/час. Эта цифра попадает в Excel, потом в борд-дек, потом в коммерческое предложение клиенту.

Реальная стоимость часа этого инженера, с учётом накладных расходов, ближе к $46/час. Разрыв в 48%. DORA State of DevOps Report 2024 фиксирует non-coding overhead в инженерных организациях на уровне 35–55% от ФОТ. McKinsey Developer Velocity Index (2023) даёт примерно тот же диапазон. Большинство компаний этот множитель просто не применяют. Они квотят, скоупят и бюджетируют по «голой» цифре, а потом удивляются, почему юнит-экономика не сходится.

{/* truncate */}

Наивная формула и где она ломается

Дефолтная стоимость часа выглядит как monthly_salary / 160. 160 — это европейская/казахстанская конвенция рабочего месяца: примерно 8 часов × 20 рабочих дней. PanDev Metrics использует ту же константу в dual-rate движке: когда у разработчика в Department указана MONTHLY-ставка ($/мес.), система внутренне конвертирует её в HOURLY как rate / 160.

Это direct rate. Для того, что он представляет, он корректен: financial-grade перевод оплаченной зарплаты в часовое выражение.

Чего он не учитывает:

  • Зарплату EM/team-lead'a, к которому относится разработчик.
  • Зарплату DevOps-инженера, который держит staging живым.
  • HR-партнёра, ведущего онбординг.
  • 4 часа в неделю, которые разработчик тратит на встречи и code review (коммитов нет, времени тоже).
  • 2 недели на квартал, ушедшие на инциденты, ramp-up на новом проекте или research-спайки.

Ничего из этого не отображается в payslip разработчика. Всё это реальные деньги, которые компания платит, чтобы инженер мог сделать ту работу, которая в payslip отображается. В классическом учёте это называется overhead. Инженерные руководители, которые не умножают на этот коэффициент, квотят фантастику.

Stack Overflow Developer Survey 2024 даёт глобальную медиану задекларированной рабочей недели в 41.7 часов, из которых на собственно код уходит 40–60%. Остальное на встречи, планирование, обучение и ожидание зависимостей. В пересчёте на месяц это где-то 64–96 часов «реального» выхлопа из 160 оплаченных. Деление зарплаты на оплаченные часы недо-оценивает продуктивный час в 1.5–2.5 раза.

Формула loaded rate

Стандартная учётная формула:

loaded_rate = direct_rate × (1 + K)

Где K — это overhead-коэффициент: отношение косвенных издержек к прямой продуктивной работе. PanDev Metrics считает K через OverheadCoefficientService:

K = adminSalary / (taskTotal + nontaskTotal)

Три компоненты:

  • taskTotal: сумма оплаты за часы разработчиков, привязанные к таск-трекеру (Jira issue, ClickUp task и т.д.). Это прямая работа, которую могут назвать заказчик или продакт.
  • nontaskTotal: сумма за часы кода без таска. Встречи, code review, research-спайки, ramp-up, инцидент-разбор. Это тоже инженерный output, просто не атрибутируемый к фиче.
  • adminSalary: фиксированная месячная стоимость менеджмента и эксплуатации. Time-share тимлидов на менеджмент, ФОТ EM/директоров, DevOps platform engineers, IT, амортизация затрат на найм. Всё, что платится, но это не разработчик, пишущий код.

Типичный K на нашей customer-базе: 0.20–0.60. K = 0.30 значит, что каждый $1 прямой dev-стоимости несёт $0.30 организационного overhead. K = 0.55 это почти полтора сверху.

Разбор примера: senior-инженер в Алматы

Senior backend, $5 000/мес.

ШагЦифра
Месячная зарплата$5 000
Рабочих часов в месяце (конвенция)160
Direct hourly rate$31.25
K департамента (март 2026, посчитан)0.48
1 + K1.48
Loaded hourly rate$46.25

K = 0.48 пришёл из реальных книг департамента в этом месяце:

КомпонентСумма
taskTotal (код, привязанный к таскам)$20 000
nontaskTotal (встречи, review, research)$9 000
adminSalary (EM + DevOps + IT-аллокация)$14 000
K = 14 000 / (20 000 + 9 000)0.483

Разрыв в 50% между наивной и нагруженной ставкой не экзотика. Это нормальное состояние любой инженерной организации, где есть реальный менеджерский слой.

Почему один K на всю компанию скрывает правду

LinearB, Jellyfish, Code Climate и большинство DIY-табличек используют единый усреднённый K, выбранный раз в год и применяемый плоско на каждый проект, каждый месяц, каждый отчёт по cost-per-feature. Для годового отчёта это работает. Для квотирования проектов и середины года не работает.

Причина: K двигается от месяца к месяцу, иногда резко.

  • Q4 (окт–дек): nontaskTotal растёт от year-end planning, performance reviews, holiday backfill, реоргов. K сдвигается вверх.
  • Июль–август: половина команды в отпуске. taskTotal падает, adminSalary константа. K растёт снова, но по другой причине.
  • Месяц после реорга: менеджерский headcount подрос раньше, чем dev-headcount. adminSalary скачет, K скачет.
  • Месяц с тяжёлыми инцидентами: nontaskTotal поглощает разбор инцидентов, K сдвигается вверх.

PanDev Metrics считает K помесячно по департаменту. Cost-per-feature для фичи, выкаченной в ноябре, использует ноябрьский K, а не среднегодовой. Разница ощутима: на customer-базе мы регулярно видим K, осциллирующий между 0.32 и 0.61 в одном календарном году внутри одной команды. Плоский 0.45 неправильно ценит половину месяцев в обе стороны.

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

Naive vs loaded по типичной инженерной команде

РольМесячная компенсацияDirect rateK департаментаLoaded rateРазрыв
Junior$3 000$18.750.48$27.75+48%
Mid$5 000$31.250.48$46.25+48%
Senior$7 000$43.750.48$64.75+48%
Staff$10 000$62.500.48$92.50+48%
Контрактор$12 000 (счёт)$75.000.10$82.50+10%

Строка с контрактором обычно ловит CFO врасплох. Контрактор, выставляющий счёт через своё юр.лицо, несёт минимальную аллокацию adminSalary, потому что сам платит за свой менеджмент. K для контракторской стоимости намного ниже, обычно 0.05–0.15 (только амортизация рекрутинга и PM overhead). На часовой базе $75/ч контрактор может оказаться дешевле, чем «$31/ч» senior-сотрудник, если оба нагружены честно. Этот инсайт заставил уже не одного нашего клиента пересмотреть соотношение employee/contractor.

Naive против loaded ставки на пяти инженерных ролях. Разрыв виден на каждом уровне seniority, кроме контракторов. По всей организации наивная ставка недо-оценивает каждую штатную роль примерно на 48%. Контрактор это исключение, и именно этот рычаг большинство CFO упускают.

Где K-коэффициент живёт в продукте

PanDev Metrics получает K автоматически из данных, уже текущих через платформу: IDE heartbeat-данные привязывают coding-минуты к таскам (когда разработчик сидит в task-named ветке вроде feature/PDM-3475) или к non-task-работе (всё остальное). Зарплаты и admin-аллокации настраиваются один раз в Department settings. OverheadCoefficientService пересчитывает K каждую ночь. Cost-per-feature, engineering ROI и квотирование проектов читают K текущего месяца, а не статичное значение.

Это тот же движок, что стоит за нашим модулем hourly rate и cost tracking, и это input-слой для расчётов cost per feature ниже по pipeline.

В UI K выводится отдельной карточкой с историей по месяцам. Финансовая команда видит, в каком месяце K был 0.31, а в каком 0.58, и может сразу прокликаться к составляющим: где конкретно вырос nontaskTotal, какие департаменты дали скачок adminSalary, какой проект просел по taskTotal. Это тот уровень разлёта по дереву, который превращает «у нас в среднем 45% надбавка» в реальный аудит. По нашему опыту, после первого квартала с помесячным K финансовая команда перестаёт спорить с инженерным руководством о квотах: цифра одна, источник один, история одна.

Что наша модель не сможет сказать

Честное ограничение: модель K-коэффициента предполагает, что вы можете чисто разделить task vs non-task работу через IDE-телеметрию. Если ваши разработчики не следуют convention feature/TICKET-ID, платформа не может определить, было ли coding-time таском или нет. Командам без IDE-уровня tracking'а понадобится bootstrap K через ручной time-allocation survey первые 1–2 месяца (обычно 5-минутный еженедельный self-report), пока покрытие не станет достаточным, чтобы доверять автоматическому числу.

Ещё два ограничения, которые стоит назвать:

  • Капитализированная vs экспенсная работа. Некоторые учётные режимы (US GAAP) капитализируют новую продуктовую разработку и списывают maintenance в расходы. K тут то же самое число; различается, как вы книжите loaded cost. CFO применяет cap/exp split после loaded rate, а не до.
  • Open-source contribution time, который косвенно работает на компанию (например, разработчик мейнтейнит библиотеку, от которой зависит продукт), сидит неудобно. По дефолту мы кладём это в nontaskTotal. Если ваша бизнес-модель требует считать это прямыми затратами, это вопрос конфигурации, а не формулы.

Что сделать на этой неделе

  1. Поднять прошлый месяц по одному департаменту: суммировать ФОТ разработчиков (dev_total). Суммировать менеджмент + DevOps + IT, аллоцированные на этот департамент (adminSalary).
  2. Из трекера достать часы-на-тасках vs часы-вне-тасков за тот же месяц. Умножить на часовые ставки → taskTotal, nontaskTotal. (Если разделить нельзя, нижняя оценка nontaskTotal = 25% от dev_total.)
  3. Посчитать K = adminSalary / (taskTotal + nontaskTotal).
  4. Переквотировать два самых крупных активных проекта по loaded rate. Дельта это маржа, которую вы отдавали клиенту бесплатно, не зная об этом.

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

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

По теме

Готовы увидеть метрики своей команды?

30-минутная персональная демонстрация. Покажем как PanDev Metrics решает задачи именно вашей команды.

Забронировать демо