После 2-х лет разработчиком на С# в небольшой английской компании в сфере строительства, я решил выяснить свою стоимость как специалиста на рынке труда Великобритании. Несмотря на то, что большинство вакансий представляют собой примерно одно и то же: «Требуется человек-оркестр с 10+ лет опыта для очень интересной работы», — я специально выбирал позиции исключительно младшего разработчика, не содержащих цифр 5+, 10+ и 15+ в описании. Как это было — читайте дальше.
1. Дисклеймер
Эта статья два года лежала у меня в набросках, и я сомневался, стоит ли ее вообще публиковать. За это время некоторые детали историй были утрачены, но неадекват на интервью-допросах я помню хорошо. Описанные события происходили до пандемии, примерно в 2019-м. Поэтому в статье есть отличия от современных реалий. Например, очное собеседование, в котором сегодня практически нет необходимости.
2. Деревья
Холодным весенним утром я ехал на такси в аэропорт, чтобы отправиться в Лондон на собеседование на должность Junior C++ Developer. Небольшая компания, занимающаяся сетями и безопасностью, пригласила меня на личное интервью, после того как я потратил все выходные на выполнение их домашнего задания. Мне сообщили, что разработчики похвалили мои решения, однако у них были и некоторые замечания, которые они мне не скажут, чтобы их решения не слили в сеть. Это был предварительный тест, состоящий из десятка задач по массивам, указателям в C/C++, массивам указателей, числам Фибоначчи, а также статистике и одному теоретическому вопросу про метод finalize() в Java.
Никаких конкретных инструкций по подготовке к интервью мне не дали. Более того, сообщили, что никакой особой подготовки и не требуется. И вот я в самолете, сижу — читаю длинный список различий между Java и C#, просто так, на всякий случай. К чести компании стоит отнести то, что мне забронировали гостиницу на ночь перед интервью. Поэтому утром, хорошенько выспавшись, я отправился по назначенному адресу.
Встретил меня один из разработчиков, очень дружелюбно, и пригласил в стеклянную комнату, откуда был виден почти весь оупенспейс. Он расспросил, нормально ли я доехал, и рассказал, что делает компания. Потом я рассказал о себе. Он задал мне несколько технических вопросов и попросил решить пару несложных задач на доске. Потом он пригласил другого разработчика, с которым мы в деталях обсудили как я реализовывал проект научных вычислений на кластере с использованием С++. Он задавал исключительно осмысленные вопросы по моей теме, чем оставил хорошее впечатление.
После перерыва меня пришел собеседовать еще один товарищ, которого мне представили как высококлассного специалиста, который у них на полставки «решает проблемы бизнеса». Вероятно, увидев в моем лице очередную проблему для бизнеса, он решил сразу озадачить меня обходом бинарного дерева. К этому, признаться, я был не очень готов. И если простой обход я кое-как вспомнил, то какой-то хитрый подсчет суммы в дереве, где надо было использовать какой-то метод скользящего окна (попробуй придумать это, стоя у доски), я конкретно запорол. На этом интервью закончилось. Весь процесс занял примерно 4 часа.
По возвращении домой мне прислали отказ, прокомментировав это тем, что было 2 положительных и 1 отрицательный отзыв по моей кандидатуре. В общем, умеют мастерски выводить на чистую воду «джунов-самозванцев», не способных на ходу щелкать задачки по деревьям. Теперь я знал, что навык работы с деревьями не только совершенно необходим, но и должен быть решающим при найме программиста на работу вне зависимости от прочих умений и опыта. В моем случае особенно «уместной» была рекомендация внутреннего рекрутера приезжать на интервью без подготовки. Как говорится, «не верь улыбке прокурора».
В 2021-м я снова подал резюме в эту же контору, т. к. мне интересна данная сфера деятельности. Меня ожидали те же задачки и обычное, не изнурительное, в отличие от предыдущего, собеседование. И отказ без конкретики. Вероятно, в этот раз мои финансовые ожидания в £60K (среднее по рынку) показались им слишком большими. Мне говорили, что вчерашние студенты у них работают за «up to £40K», видимо намекая, какую зарплату стоит просить. Спасибо, но я уже давно не студент.
3. Сборщик мусора
Возвращаемся в 2019-й. Очередная компания, вакансия C# разработчика и снова тестовое задание. В этот раз мне предстоял онлайн тест по алгоритмам и структурам данных на сайте Codility. Суть теста — написать функцию, которая решает строго заданную задачу на любом из доступных языков программирования. Затем решение проходит несколько unit-тестов на скрытых наборах данных и, исходя из количества успешных тестов, формируется итоговая оценка.
Инвестиционная компания, пригласившая меня выполнить этот тест, дала понять, что их специальность — финансовые операции, а там все очень серьезно и им, мол, нужны настоящие специалисты. А тест по программированию нужен, чтобы отсеять всяких проходимцев, и задачи для этого будут соответствующие. Я отнесся к этому тесту со всей серьезностью, предварительно перелопатив кучу задач по деревьям, скользящим массивам и прочей ерунде, с которой ни разу до этого не сталкивался.
Онлайн тест включал в себя 3 задачи на 3 часа. Две из них были относительно простыми, хотя и не без подвоха, а одна мне показалась просто-таки убойной сложности. Вот условие своими словами:
Задан массив целых чисел из диапазона [-100; 100]. Максимальный размер — миллион элементов (или миллиард — точно не помню). Реализуйте эффективный алгоритм подсчета количества всех возможных непрерывных подмассивов, сумма элементов которых равна нулю. Если таковых больше миллиарда — вернуть -1.
Время выполнения программы ограничено, поэтому ни о каком O(n^2) или тем более O(n^3) не может быть и речи. Здесь пришлось изрядно попотеть, чтобы найти приемлемое решение, которое бы работало достаточно быстро для прохождения теста на время. Сложность своего решения я не прикинул, но предполагаю, что там было чуть хуже чем O(n*log(n)). В итоге я получил максимальную оценку 100 баллов из 100 по каждой из трех задач. Наверняка, в этой конторе не каждый день видели такой результат, и мне оперативно выслали приглашение на телефонное интервью.
Беседовал я с сеньором всех сеньоров (да, примерно так он и представился). Разумеется, ни одного общего вопроса или обсуждения решенных мною задач не было — это все пустая трата времени. Самым первым его вопросом было «Как работает сборщик мусора в .NET?» — да, вот так сходу. Ни здрасьте, ни наводящей дискуссии, которая обычно призвана подтолкнуть к ответу. Вынь да полож выдержку из runtime specification. Естественно, специфики .NET в этом вопросе я не знал, и прямо об этом сказал, но попробовал все-таки ответить по существу. Я рассказал, по каким принципам обычно устроены сборщики мусора — построение дерева ссылок, перепаковка объектов в памяти и т. п. банальные вещи. В ответ на это он мне процитировал спеку о трех поколениях объектов. С точки зрения интервьюера, знание конкретной реализации GC было особенно важно и моих общих представлений о нем было явно недостаточно.
Следующим вопросом было как устроено разрешение коллизий в Hashset. Я подумал, что он прикалывается, задавая настолько случайные вопросы. Вспоминая университетские лекции, я попытался рассказать о построении дерева хэшей и помещении коллизий в отдельную структуру, но я никогда не знал и не знаю, как именно это реализовано в C#.
Вероятно, какой-нибудь проницательный сеньор с 10+ лет опыта, читающий данную статью, уже испытывает негодование от недостатка квалификации автора. Действительно, как можно претендовать на работу программистом без должных знаний по деревьям, хэш-таблицам и сборщикам мусора?! Удивительно, как его вообще кто-то нанял разработчиком, а не листовки раздавать!
Короче говоря, мое интервью с мега-сеньором продолжалось еще несколько минут в том же духе и с последующим отказом. Хорошо еще, что не пришлось никуда ехать и лично присутствовать на подобном допросе. Оглядываясь назад, я могу определенно сказать, что сия контора продемонстрировала одно из худших отношений к соискателю, с которым я когда-либо сталкивался.
4. Вместо заключения
Здесь я планировал описать еще как минимум одно интервью, но все происходящее в нем было очень похожим: устранение пробелов в теории, тестовые задачки, странные вопросы на собеседовании, отказ.
Обобщив свой опыт, я могу сказать следующее — усиленная подготовка к интервью и проработка предыдущих ошибок ничего не гарантируют. Джуна можно спрашивать все, что угодно, и он вряд ли легко отвертится. Соискателей на младшие позиции валят на собеседованиях пачками, и для этого в компаниях, видимо, есть специальные «сеньоры».
Хорошо, скажет читатель, допустим, мы долго готовились и вызубрили спецификацию языка и всей его экосистемы. В таком случае, как насчет телефонного экзамена по математике? Или стресс-тестирования вопросами типа «кем вы себя видите через N лет» и «как быть, если ваш коллега — аутист»? Ах да, мы с вами еще забыли выяснить поведение случайного куска говнокода вне контекста и без метода Main().
Личное присутствие на интервью только усложняло ситуацию. Дело в том, что в 2021-м, с популяризацией удаленки, искать новую работу стало на порядок проще, чем в 2019-м. Сегодня не обязательно отпрашиваться у начальства и заранее получать разрешение на каждый чих. В те времена, до поездки на интервью, нужно было предварительно взять выходной, изучить расписание транспорта и спланировать маршрут в незнакомом городе, отчего многие собеседования превращались в сложный квест, и без того требующий плотной подготовки. Халатное отношение к соискателю впоследствии воспринималось как издевательство.
Впрочем, описанные события — давно в прошлом и являются лишь единичными примерами из моего опыта. Вполне возможно, что упомянутые компании все-таки нанимают младших разработчиков и даже иногда предоставляют им нормальные условия. Однако, мой опыт приучил не столько готовиться к сложным вопросам, сколько распознавать «звоночки» на ранних этапах.
(Картинка с мусоровозом из этого блога.)