Найм нового поколения сотрудников в ML стартап в условиях киберпанка

Дизайним процесс и микро-сорев чтобы не подтекало

Posted by snakers41 on August 12, 2020

Найм нового поколения сотрудников в ML стартап в условиях киберпанка

Как искать людей в стартап? Недавно мы приняли решение немного расширить команду нашей компании. Поехали. Будет много прикольных инсайдов и срывов покровов.

И самое главное, как не делать самую дорогую ошибку - в людях? Вы же знаете что такое bozo explosion? В такой ситуации на ум сразу приходят финансовые инвесторы, раздутая оценка, bulshit bingo, “мы меняем мир” и прочее мракобесие. Если стартап связан как-то связан с ML (или как клоуны и евангелисты называют его “AI”), то тугая струя крипто-блокчейн-вайти-предпринимателей бьет с удвоенной силой.

Всем уже набил оскомину этот образ, но если спуститься на землю, особенно в условиях современного киберпанка, передела мира (Huawei, TSMC, ARM если вы понимаете о чем я), национализации экономики, обнуления и погружения страны в зеленую пучину на букву “С”, то окажется, что на самом деле на рынке преобладают несколько типов работодателей в сфере ML, под которых и оптимизуются молодые неокрепшие умы:

  • Кровавая госуха, слежка, угнетение, итд итп;
  • “Работать у нас в компании большая честь” и оплаченные ими специальные олимпиады и секты;
  • Компании которые не хотят платить US$100-200k в долине и рассматривают СНГ как качественных и дешевых индусов;
  • Классные ай-ай стартапы, на поверку оказывающиеся привузовскими галерами на распиле с 70 сотрудниками с зп в районе 15-25к;

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

Ситуация на доске

Итак перейдем к конкретике. Что имеем:

  • Наш молодой душевный стартап, который в первый раз полноценно работает с рынком труда;
  • Какой-то минимальный накопленный HR бренд, выраженный в виде нашего датасета Open STT и публикаций;
  • Ковид, киберпанк, удаленная работа (нас это особо не затронуло, т.к. как работали на серверах по ssh так и работаем), remote first даже для тех кто из Москвы;
  • Традиционные борды типа hh.ru уже давно имеют SNR близкий к нулю, а на линкедине только продаваться в иностранные аутстафф галеры или майнить 300к в секунду на 30 офферах;
  • Каких-то нормальных отраслевых альтернатив для сферы разработки / ML до сих пор не родилось (нет, продукты Тематических Медиа таковыми не являются);
  • Нежелание тратить слишком много времени и денег на неработающие процессы найма и желание всеми силами избежать bozo explosion;
  • Мы уже не раз обожглись имея дело с людьми с неправильными, а точнее отсутствующими ценностями;
  • По итогу забегая вперед - 3 реальных источника откуда пришел трафик: наш телеграм канал, борда профунктора и _jobs из ODS;

TLDR Чартик для тех кто не читает текст

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

Дизайним процесс и микро-сорев чтобы не подтекало

Обычно классический найм в компании, работать в которых большая честь, работает примерно так:

+  +---------------------------------+
|  |1 Скрининг over 9000 резюме HR|ом|
|  +---------------------------------+
|
|  +-----------------------+              +---------------------------------+
|  |2 Собеседования с HR|ом+------------->+Где|то еще сбоку тестовое задание|
|  +-----------------------+              +-------------------------+-------+
|                                                                   |
|  +-------------------------------------------------------+        |
|  |3 Если из GAFA или работать у вас большая честь        |        |
|  |  То тут решение задачек у доски или на сайте с тестами+<-------+
|  |  По сути еще один шаг                                 |
|  +-------------------------------------------------------+
|
|  +--------------------------------+
|  |4 Собеседование с руководителем |
|  +--------------------------------+
|
|  +-----------------------------------------------------+
|  |5 Собеседование с ЛПР|ом или финальное собеседование |
v  +-----------------------------------------------------+


Сразу видны проблемы, про которые все знают, но почему-то с ними никто ничего не делает:

  • Каждый этап может занимать 1-2 недели, когда по факту многие эти вещи заменяются 1 сообщением в мессенджере;
  • Каждый такой этап может подразумевать инвестицию в доставление своей тушки в ебеня;
  • (1) и (2) как правило вообще не имеют ничего общего с реальностью, только булшит бинго;
  • (3) и тестовые задания приводят к тому, что в резюме студентов технологий описано больше, чем у всего IT отдела зрелой компании;
  • Пишем код на бумажке, пишем код на доске, парное программирование, алгоритмы, задачки на очередном модном сайте, вставьте нужное;
  • И что самое главное - до сих пор никакой связи с реальностью;
  • Она появляется на этапе (4) или (5), но люди там могут быть банально не мотивированы реально уделять внимание или уже разочарованы потоком левых людей;


А что же надо проверять в реальности?

  • Ценности;
  • Мотивация человека;
  • Знания и навыки человека;
  • То, как человек сочетается с командой;


Мне кажется, что люди наиболее явно себя проявляют, когда:

  • Ты наблюдаешь за ними “на длине” (7 - 10 дней, достаточно, больше чем 1 рабочий цикл);
  • В процессе работы нужно решить какую-то условно нетривиальную задачу;
  • Задача, которую надо решить, является “игрушечной” разновидностью реальной задачи;
  • Нет “тупой” метрики (KPI) по которому оценивают (любые KPI ломаются хитрожопыми “индусами”), а оценивают по ряду факторов;
  • Нет тупых и бесчеловечных рамок (нельзя копировать текст, решать что-то на таймер, итд итп);
  • Перед человеком ставится несколько дилемм - организационных, моральных и технических и у него есть выбор как проявить себя;


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

В итоге мы пришли к такому процессу:

  • Прием заявок в телеге, handle (а он есть у 95% кандидатов) - это ID (как правило эвристика - нормальный handle и резюме которое называется по имени человека = адекватность);
  • Пара простых вопросов каждому второму;
  • 15 - 30 минутные беседы с теми, у кого много релевантного (каждый четвертый);
  • По итогам беседы предлагаем вкатиться в сорев (мы сначала думали, что сорев будет испытательной задачей, но вал заявок был слишиком велик);
  • Очень много асинхронного общения в процессе;
  • После вкатывания предлагаю в чатике похоливорить про ценности (тут обычно становится видно, что людяи просто неинтересно);
  • Кто вкатился в сорев выше 33% - предлагаю решить задачу из сорева unsupervised;
  • Просмотр решений и личное общение ИРЛ со всей командой;
  • На каждом этапе оцениваю поведение и маленькие делати и искренне стараюсь отвечать всем и вкладывать усилия в каждого кандидата соразмерно его вкладу;


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

Я честно постарался ответить первым 120 - 130 людям и провел где-то в районе 20 созвонов. Основной принцип состоял в соразмерности инвестиции времени инвестиции кандидата. Только на первичные ответы у меня ушло 3-4 дня подряд по 12 часов, я не ожидал такого потока.

Также мы придумали довольно лулзовый и простой способ отсеивать токсичных людей, мизогинистов и душнил (у нас в компании 50% девушек):

  • Задаю вопросы, общаюсь. Если есть какие-то подозрения, просто прошу поговорить голосом или в чате мою коллегу;
  • Люди, вероятно думая что общаются с HR-ом, начинают вести себя некрасиво, пассивно-агрессивно, продавать булшит;
  • Далее следует срыв покровов, люди почему-то думают, что мы не общаемся, лол;


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

Также чтобы привлечь людей с правильными ценностями, я довольно много написал текстов (чтобы вызывать какой-то отклик) и мы сделали микро-сорев:

Итоговая воронка

В итоге воронка была такая:

  • Порядка 150 заявок, учитывая поздние;
  • Около 20 человек в шорт-листе;
  • 13-14 человек из него хоть как-то решили сорев;
  • В итоге было где-то 7-8 человек, с кем хотели пообщаться;
  • На итоговую встречу позвали 5 человек, 1 человек технически временно выбыл из-за короны, но он вернется =);

Я честно постарался лично всем ответить, уделить насколько смог времени и постараться найти какие-то точки пересечения. А дальше уже вопрос куда это привело (или нет).

Ценности, нежданчики, вдохновление и грабли, немного разочарований

Вообще это довольно интересно, на самом деле во некоторых токсичных компаниях есть принцип “брать студентов МФТИ на низкую зарплату” или “брать только синьоров помидоров”. Это плохая стратегия. Нужна диверсити здорового человека. Иначе когда все сходится к одному знаменателю, наступает тепловая смерть. Допольно неплохо эта идея покрыта в этом видосе.

Наверное этот раздел лучше оформить в вид списка анекдотов а-ля “эсхатологический восторг” (это чувство хтонического восторга, которое человек испытывает гляда на гриб атомного взрыва, например):

  • Первыми граблями оказалось то, что когда мы завели сорев, простейший бейслайн на 5% данных давал на нем порядка 95%, а чуть более продвинутое решение - порядка 99%+. Понятно, что нам писали кандидаты разных бекгаундов, но поэтому также родилась идея предлагать решить задачу unsupervised и на меньшем количестве данных и смотреть кто этим заинтересуется. Что забавно, эта идея родилась в виде троллинга в диалоге с очень перемотивированным и занятым школьником (в прямом смысле школьником, не в переносном) из семьи яндексоидов (лол). Но он, в итоге конечно был слишком занят, чтобы что-то сделать;
  • Довольно занятным оказалось, что на русском языке есть блог-статья с готовым feature экстрактором для похожей задачи. Было показательно, насколько много людей его использовали, но даже не ставили ссылку;
  • Забавные лулзы, когда люди пишут, что не смогли ничего сделать т.к. были на даче, а я сам большую часть собесов сделал с дачи в Сибири и меня там ходили медведи и было 30 мегабит в пике, лол;

    Life stranger than fiction

  • Грустно стало когда в начале процесса написал парень биолог, мол работы по специальности нет, говорят у меня нет блога и пет-проектов, мне посоветовали их завести, но что-то реально делать я не буду, типа завел для галки;
  • Кандидат с 10+ лет опыта в спиче (точнее 10 лет назад он консультировал студентов на эту тему), который подается на джуна;
  • Было также забавно когда очень сильный кандидат сохранял через несколько процессов в питоне через plt.save спектрограммы в виде картинок. Ладно бы это делал человек, который вчера вкатился, но чувак довольно давно делал серьезные пет-проекты и у него классный диплом. Реальность же прозаичнее - вероятно он ждал оффера от одной из токсичных корпораций а нас использовал, чтобы расторговать их, отсюда такое отношение. Sad but true;
  • Я довольно много времени проинвестировал в описания нашей компании, датасета, ценностей итд итп. Но практика показала, что 95% кандидатов даже не знали про Open STT когда писали. Еще показательно, когда даже я прямым текстом предлагал похоливорить с людьми из шорт-листа насчет ценностей, 50% людей тупо игнорило. И что характерно, те кто имел свое мнение, как правило имели не факт, что прямо идеальные, но точно оригинальные или интересныерешения;
  • Очень много людей с платных курсов по DS за 100к, причем курсы довольно cookie cutter;
  • Один очень интересный кандидат с ганами в качестве пет-проекта (превращал вино в воду на картинках, лол) в привате сказал, что мол мы редиски, т.к. не даем железо кандидатам бесплатно на свои пет-проекты, не связанные с работой, бесплатно, а мол все дают.
  • А еще некоторые кандидаты ожидают, что в стартапе нужно работать с 9 до 5 ровно;
  • Еще лулз случился с этим же кандидатом, когда он сделал unsupervised решение (с этим feature экстрактором). Он по сути научил kmeans в 700 классов, а потом на трейне выучил маппинг из 700 в 3 класса. И … это unsupervised;
  • Самый сильный кандидат, мой фаворит (на самом деле overqualified для вакансии) имел в финальном решении несколько красных флагов, и команда решила не рисковать и тащить его еще на собеседование через всю страну. Было как-то эмоционально грустно от такого;


Анализ заявок кандидатов и решений

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

Если коротко, то я еще до начала все описал тут. Но по итогу мы смотрели на:

  • Интерес и вовлеченность человека;
  • Минимальные hard skills - код в модулях, линтер, минимализм и простота / понятность в коде;
  • Культура экспериментов или ceteris paribus тестов (тут на самом деле никто не прошел особо);
  • Отсутствие жестких косяков;
  • При прочих равных - путь пройденный человеком;

Иногда бьли кандидаты с более слабыми решениями, но с другими фишками - допустим 3+ иностранных языка или нормальный опыт в бизнесе. Очень классно смотрелись решения (одно такое решение прислали в итоге =( ) людей с DSP бекграундом.

Насчет самих решений. Если коротко - анализ, разочарования и удивления:

  • Приватная часть теста была также рандомно набрана для шума и музыки, но языки в речи в трейне, паблике и привает были разные. Об этом мне написал буквально 1 или 2 человека. Плак-плак;

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

  • Участник с ежиком из OgoMk на аве в телеге, как мне показалось, довольно изящно потроллил, тоже залив такое 99.5% решение на 100% данных;

  • Но я был весьма разочарован, что большая часть supervised решений сетками: не имела аугов или какой-то внятной регуляризации, не учитывала структуру и redundancy звука, за редким исключением. Ну типа сохранили спектрограммы на диск и скопировали свое cookie cutter решение откуда-то, местами даже не убрав Variable в питорче;

  • Идеальная архиктура тут - CNN энкодер, RNN + attention классификатор, но это неточно;

  • Также я был удивлен, что все писали VGG-like наивные сетки (ага, забывая про скипы, батч-норм и relu), но никто просто не взял какой-то резнет или мобайлнет и не родил на его основе что-то. Я запретил пре-трейн, но тут сама сетка же важна, точнее умение ее перекроить под себя;

  • Я был немного расстроен, тем несколько людей сохраняло несчастные спектрограммы как картинки на диск через matplotlib, даже для решений с 1-3% данных, ведь это не то чтобы боттлнек;

  • Большая часть отпраленных supervised решений крутилась вокруг 3 - 5 - 10% данных. Нормальные сетки давали 95-97%, леса изи давали 95%, но были и топорные решения со средним mfcc + svm тоже … на 95%;

  • Качество решения на самом деле видно было скорее по генерализации на приват. У одного кандидата за счет регуляризации (он кажется единственный кто сделал ее), на привате было больше на 1%. Он выкидывал много информации, но по сути это было очень сильно регуляризацией. Но юзать больше фреймов на тесте сделав тем самым TTA он не догадался;

  • Что касатеся unsupervised решений, то тут было три ветки мысли - автоэнкодер на спектрограмме, нагугленный feature экстрактор (причем только один человек дал на него ссылку), и один более менее оригинальный и объясненный feature экстрактор (фичи мы поковыряем ниже);

  • Все использовали в основном k-means + PCA, про UMAP знал буквально 1 человек. HDBSCAN никто не использовал;

  • В итоге скор на k-means без лика на готовых фичах или на своих фичах (и как мы ниже нашли даже тупо на MFCC) был где-то 80 - 85%;

  • Автоэнкодеры внезапно особо не зашли. Пара человек попробовала много вариаций, они работали, но они явно энкодили что-то свое, только им понятное. UMAP с ними рисовал какие-то круглые блобчики, но автор решения так и не нашел, что они значат. Sad but true;

  • Было еще прикольное решение, где по сути учится сетка с k-means слоем в центре. Девушка выбила 90%, но там довольно cryptic код на керасе, правильно было наверное искать какую-то imagenet соту на питорче, там такие статьи были. Причем на FAISS каком-то можно даже это в train луп прямо быстро вставить =);

  • autoencoder_blobs

    Автоэнкодер что-то нашел

  • autoencoder_blobs_pain

    Но оно немного перпендикулярно решаемой задачей

  • autoencoder_one_blob

    Один блобчик

Анализ unsupervised фич которые использовали кандидаты

Вот лучшая картинка из unsupervised решения.

best_candidate_clusters

Лучшая картинка из “честного” unsupervised решения

А вот несколько картинок визуализации STFT => MEL => MFCC => все фичи.

stft

STFT

mel

MEL

mfcc

MFCC

all_features

Все фичи


Ну и мы честно погоняли ablation тесты на разных алгоритмах. Видно что тащит на самом деле MFCC + standard scaler. По сути MFCC это тут предобученная на знаниях о речи микро-сетка. Остается открытый вопрос - тащить ли какие-то эти фичи в реальные большие продовые сетки, но результаты отрезвляют на самом деле.


Ablation тесты

Сухой остаток

Большое спасибо всем, кто участвовал. Было прикольно. Это стоило больших усилия для меня лично и для нашей команды. Я постарался быть честным и открытым в процессе. Если мы где-то что-то проебали или кого-то обидели, просим прощения. Спасибо, что прочитали это!