Что дорожает на самом деле
Вакансия на Rust умирает не отказами, а тишиной: откликов почти нет, рекрутер бодрится, задача в плане стоит. Через какое-то время в обсуждении звучит «просто предложите больше» — и с этого места обычно начинаются главные расходы.
Зарплата здесь — самая видимая и при этом самая маленькая часть затрат. Платить в итоге придётся временем, часами собственных сеньоров и простоем той самой задачи, к которой нанятый человек должен был приступить. Поэтому цифр в статье не будет: средние по рынку вам всё равно не помогут, у вас свой поток кандидатов, своя команда и свои ставки. Вместо цифр — модель, в которую вы подставите свои значения. Начинаем с арифметики воронки, потому что именно там сидит основная стоимость.
Время закрытия растёт как произведение, а не как сумма
Возьмите свою последнюю вакансию по ходовому языку — Java, Go, Python, неважно — и восстановите её воронку: сколько откликов приходило в неделю; какая доля откликов проходила скрининг; какая доля дошедших проходила техническое интервью; какая доля прошедших получала оффер; какая доля офферов принималась. Это ваши базовые значения, другого честного источника у вас нет.
Скорость найма определяется произведением: отклики в неделю, умноженные на все эти доли по цепочке. Поделите единицу на результат — получите примерное число недель до одного найма.
Теперь редкий язык. Не мажьте все конверсии одной поправкой «за редкость» — смотрите, где редкость бьёт по устройству, а где нет. Поток на входе уже, потому что пул физически мал. Скрининг, наоборот, может проходить лучше обычного: на вакансию с редким языком откликаются в основном те, кто выбирал его осознанно, случайных людей в потоке меньше. Техническое интервью по качеству то же, но кто будет его проводить — вопрос отдельный, об этом ниже. А вот принятие оффера проседает: людей с редким стеком мало, все работодатели ниши видят одни и те же лица, и у хорошего кандидата почти всегда параллельно идут другие процессы.
Подставьте свои отношения — во сколько раз уже поток, во сколько раз ниже принятие оффера — и посчитайте новое время закрытия той же формулой. Главное: произведение нескольких чисел, каждое из которых чуть меньше единицы, убывает быстрее, чем любое из них по отдельности. Интуиция подсказывает «искать будет подольше»; арифметика возражает: когда узким стало сразу несколько звеньев, время растёт как произведение сужений, а не как их сумма, и «подольше» легко превращается в «сорванный плановый горизонт».
Строки, которых нет в бюджете вакансии
Часы интервьюеров. Каждый нанятый тянет за собой цепочку непрошедших, и длина цепочки — та же обратная величина произведения конверсий: редкий язык множит не только время, но и число интервью на одного нанятого. Проводить их должен человек, знающий язык, — ваш самый дорогой сотрудник либо внешний интервьюер за отдельные деньги. Плюс подготовка и разборы. И мнение, с которым можно спорить: алгоритмические задачи про списки почти ничего не говорят о том, как кандидат договаривается с компилятором о владении и временах жизни, — а именно это вы покупаете.
Цена пустого кресла. Пока воронка работает, задача стоит. Считайте простоем: ценность стоящей работы в единицу времени плюс ожидание тех, кто от неё зависит. Если закрываете подрядчиком — разницей его ставки и ставки сотрудника, умноженной на часы. Берите ту строку, которая у вас реально происходит, а не ту, что приятнее смотреть.
Онбординг. Внешний найм со стеком в руках всё равно изучает ваш домен; время до продуктивного вклада — тоже стоимость найма, только в чужой строке бюджета.
Удержание. Спрос, который в мейнстриме размазан по большой базе, здесь концентрируется на маленькой: специалист с редким стеком — постоянная цель хедхантеров. Воронку, которую вы построили один раз, планируйте строить заново. Дешёвая страховка — не сжигать финалистов прошлых процессов: отклонившиеся тогда — тёплый список на следующий раз.
Тупик, который пробуют первым: поднять вилку
Первый ход почти всегда один: поднять зарплату в вакансии. Оно и понятно — единственный рычаг, который можно дёрнуть сегодня, ни с кем не согласовывая. На ходовых языках он работал: поток кандидатов там эластичен, предложил больше — получил и больше откликов, и больше принятых офферов. Привычка переносится, устройство рынка — нет.
Арифметика возражает: принятие оффера — последний множитель произведения. Если узкое место на входе, улучшение последнего множителя почти не двигает результат: вы чаще получите согласие от тех же немногих людей.
И рынок возражает: деньги не создают специалистов по редкому языку, они перераспределяют тот же маленький пул между теми, кто готов платить. Вы вступаете в аукцион с несколькими работодателями за тех же нескольких людей, и премия в таком аукционе — рента, а не мощность: платите больше, людей больше не становится. Отложенный эффект тоже есть: наём с премией закрепляет её как ориентир, и следующая вакансия в команде начнётся от новой базы — независимо от языка.
Соседняя ловушка — снизить планку: «возьмём сильного без языка, освоит на месте». Вакансия закрывается, отчёт зеленеет, а расходы переезжают туда, где их не видно: медленные ревью, съеденный календарь ментора, сорванные оценки. Воронку это не обходит — стоимость просто переезжает в чужой бюджет.
Что на самом деле двигает произведение: география — единственный способ увеличить сам поток, а не множители; честный текст вакансии — люди, осознанно выбравшие редкий стек, отсекают формулировку «переписываемся на Rust, как пойдёт», потому что для них это риск вернуться к ходовому языку; и поиск там, где видна работа, а не резюме: контрибьюторы в открытые библиотеки, авторы докладов.
Выращивание своего: та же арифметика, другие строки
Альтернатива внешнему найму — вырастить специалиста из сильного инженера внутри. Логика та же, строки другие.
Часы ментора. Незаменимый ресурс один: человек, который уже довёл код на этом языке до продакшена. Туториалы и документация тут не замена: владение и времена жизни усваиваются через ревью-цикл, а без ревьюера цикл не замыкается. Нет ментора — нет пути.
Спад производительности. Ученик какое-то время работает медленнее обычного: у языка честная кривая входа, и это следствие тех самых гарантий, ради которых его и берут. Считайте: зарплата × длина спада × доля потери. Длину спада знаете не вы и не мы, а ваши люди, которые уже переходили на новый язык, — спросите их.
Риск неудачи. Какая-то часть попыток не взлетает, и долю мы называть не будем: «средней для вас» не существует. Считайте так: стоимость неудачной попытки — потраченные часы ментора плюс упущенное время; умножьте на собственную оценку вероятности неудачи. Если результат больше того, что вы готовы потерять, путь не ваш.
Мотивация. Единственная строка, которую нельзя купить. Человек, который сам захотел этот язык, пройдёт кривую быстрее того, кому его выдали задачей в трекере. Тот же механизм работает при найме «сильного без языка» снаружи, с одной добавкой: мотивацию кандидата вы не увидите до оффера — узнаете в первые недели.
Позиция редакции
Мы считаем: если в команде уже есть хотя бы один человек с продакшен-опытом на Rust и горизонт измеряется кварталами, а не неделями, выращивание своего сильного инженера дешевле и надёжнее внешнего найма. Дешевле — потому что вы не платите ренту на аукционе за маленький пул. Надёжнее — потому что не зависите от того, что кто-то из этого пула примет именно ваш оффер.
Условие, при котором эта позиция неверна: узкое место вашей воронки — не поток кандидатов, а принятие оффера. Если кандидаты доходят до финала, но уходят к другим, — людей достаточно, слабое предложение; тогда деньги становятся правильным рычагом, а выращивание лишь откладывает ту же проблему. Позиция неверна и тогда, когда внутри нет человека, который сам этого хочет: мотивация не назначается, и «выращивание» без неё — бесконечный спад производительности.
И рамка поверх всего: если сам выбор языка под вашей задачей под вопросом, модель найма не спасает — сначала посчитайте, окупается ли он здесь вообще; об этом был наш материал про Rust в сервисах. А когда найм состоялся, начинается вторая половина расходов — стоимость владения кодом, который человек напишет; что там считать и что игнорировать, мы разбирали отдельно. Найм — разовая строка. Владение — постоянная.
Что посчитать до открытия вакансии
- Восстановите воронку последней вакансии по ходовому языку: поток откликов в неделю и конверсии ступеней. Это база.
- Оцените отношения для редкого языка: во сколько раз уже поток, во сколько раз ниже принятие оффера. Источник — ваши вакансии, не чужие средние.
- Посчитайте время закрытия: единица, делённая на произведение. Умножьте на цену пустого кресла в неделю.
- Прибавьте часы интервьюеров из расчёта «интервью на один найм» и заложите повторный запуск воронки.
- Рядом посчитайте выращивание: часы ментора, спад производительности, ваша оценка вероятности неудачи.
- Сравните две суммы целиком. Решение по одной зарплатной вилке сравнивает видимое с видимым — и поэтому обычно ошибается.