Первое интервью за 7 лет

Ilya Zykin
7 min readMar 2, 2023

Пишу на русском, так будет просто быстрее. Хочу зафиксировать эмоцию.

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

Во-первых, я сам пока работу не ищу. Царь устал. Царь отдыхает. Деньги есть. Не все виски еще выпито. Не все личные проекты доведены до состояния — наигрался, можно двигаться дальше.

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

Зачем?

Зачем пишу?

Хочу зафиксировать для самого себя (и потомков) ход своей мысли. Публично рефлексирую.

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

А еще мне хочется рассказать о том, что происходило в моем сознании и о той стороне, которая проводила интервью со мной.

Что случилось?

Общался с очень приятными людьми о разном. Об интересном. Больше говорил сам. Как всегда не очень хорошо слушал. А надо бы было.

Но. Хотя я и был на позитиве и расслабоне — cтресс есть стресс. А встреча с незнакомыми людьми это всегда стресс. Особенно если ты понимаешь, что их задача как-то тебя оценить.

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

Вводные

Мы немного проговаривали с HR специалистом ожидания от интервью. Мне сказали — главное, мы хотим узнать как вы думаете.

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

И грянул гром

И вот значит в конце нашего приятного общения задают техническую задачу.

Задачу рассказываю как есть.

  1. Во-первых не рассказываю о конкретной компании
  2. Во-вторых таких задач для интервью у них наверняка не одна
  3. В-третьих, задача типичная. Секрета Полишинеля я не раскрываю

Представим, что у Promise в нашей системе нет реализации Promise.all
Предложи и напиши реализацию

Реакция первая

Долбаные промисы! Никогда их не любил. Еще 10 лет назад я рассказывал на хабре https://habr.com/ru/post/193598/ про них, но с тех пор интерес к ним прошел и глаз замылился. И делать на них что-то отличное от await fetch().then() уже не приходилось примерно никогда.

В мозгу образовалась приятная тишина и пустота. Полное молчание в радио эфире.

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

Сколько это длится не знаю. Может быть секунд 10, может больше.

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

Реакция вторая

Эту реакцию не знает никто из интервьюеров. Они просто не могут ее зафиксировать. Эту реакцию никто не сможет заметить. Даже я сам. Мозгом я сам осознаю происходящее чуть позже. Сейчас это вне зоны логики и осознания.

У меня появилось чувство. И это чувство вызывает явную тревогу.

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

Катастрофа и главная проблема в том, что я не осознаю и не чувствую ни одного способа “общения” этих сущностей.

Эта проблема так и останется не решенной во время интервью;

Реакция третья

Выиграть время!

Пока меня просят открыть онлайн редактор и нажать какие-то кнопки для форка тестового задания, я продолжаю надеяться, что подсознание сработает. Что идея появится сама собой. Я пытаюсь дать себе время. Хотя чувство подсказывает, что в подсознании нет пути решения задачи.

Я уже не вижу ничего. Не браузера, ни своего экрана. Процессор загружен примерно на 120%. Свет временами пропадает.

Я думаю о том, что new Promise и Promise.all возможно имеют какие-то средства коммуникации. Pub/Sub? Да нет; Такого быть не может. А как тогда? Как они это делают?

Спокойно! Надо успокоится и взять себя в руки! Ты сотню раз видел как люди теряются во время интервью. Ты сам их подбадривал и помогал. Главное сохранять самообладание. Что-то да получится. Просто дай себе еще время.

Реакция четвертая

Кодинг во время интервью это зло. Сразу после открытия редактора фокус смещается на него. На технику, а не на мышление.

Я совсем забыл, что задачи надо сперва решать в голове. Точнее так. Задачи и во время интервью сперва надо решать в голове.

Я несколько минут форматировал код в удобном для меня виде. Еще раз пытаясь дать подсознанию сформировать решение. “Почувствовать его”.

Я продолжаю тянуть время и читать простой код. Даю себе еще шанс.

Но как же мать вашу all и массив промисов могут взаимодействовать? Какой у них канал связи? Как это устроено? Черт его дери! Ни одной идеи! Не понимаю!

Как только будет найден вариант связи сущностей — задача перейдет в чистую технику. А вот идея никак не появляется.

Реакция пятая

Мои интервьюеры не только умные, но еще и понимающие ребята. И просто по-человечески адекватные. Заметив мои шатания со строчками кода они предлагают совершенно фантастическую вещь. Ее я украду в свой инструментарий.

Стоп, — говорит ведущий. — Закрой код и редактор. Давай подумаем над самой задачей а не над кодом.

Я закрываю редактор. Понимаю, что теперь это меня не блокирует. Я уже провалился и можно успокоится. Только теперь, когда уже от меня ничего особо и не ждут, я могу успокоиться и начать думать. Фуф!

Реакция шестая

На 10 минуте матча, когда противник уже победил, появяется логика. Уже не плохо.

2 сущности (метод all и массив промисов) должны как-то обмениваться информацией. Ок.

Как это может быть со стороны all? Единственный вариант который я вижу — периодическая проверка всего массива и состояния промисов в нем. Говно — идея! Так быть не может. Я это произношу вслух. Интервьюер соглашается.

Как это может быть со стороны массива промисов? Каждый промис при своем выполнении может “пинговать all” и сообщать что он выполнился. Эта идея нравится интервьюеру больше.

Мы начинаем обсуждать, что должно быть на стороне all.
Ну, сперва я предполагаю массив из [true, false] значений, чтобы знать когда все промисы выполнятся. Понимаю, что это бредовый подход и проще просто считать кол-во выполненых промисов. Причем считать надо с размера массива до нуля. Не знаю почему я вдруг так решил, но эта идея мне самому понравилась.

Когда значение счетчика достигнет нуля, я просто вызову общий коллбэк.

Интервьюер принимает мой подход, и говорит, что мне бы надо не забыть еще собирать все значения от зарезолвленных промисов и обрабатывать вероятный reject.

А еще мне подсказывают, что all в оригинале возрващает промис. Это здорово, но это не отвечает на самый главный вопрос, который у меня есть. Как промисы и метод all взаимодействую?

Реакция седьмая

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

Мы добродушно прощаемся оставшись при своем. А у меня в голове только одна мысль. Как же эти две суки общаются между собой?

Интервью закончено. Я иду в кофейню попить кофе и подумать.

Реакция восьмая

Проходит примерно час-полтора.

Я открываю редактор, кидаю исходник задачи в index.js, чтобы запускать ее нодой.

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

Во все промисы, которые мне даны изначально я вставляю метод из all, который дублирует оригинальный resolve, но только для метода all.

Так я предполагаю общение промисов и метода all.

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

Еще через какое-то время я прихожу в выводу, что если я не могу организовать “красивый” канал общения сущностей, то возможно, он и не нужен. Вот такое, по-сути своей парадоксальное решение.

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

Блять! А ларчик просто открывался. Как я и предполагал.

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

Выводы

Для себя

  • Нахер этот лайв-кодинг на интервью. Я совсем забыл, что можно отказаться от написания кода. Познакомиться с задачей, обозреть код и закрыть редактор, чтобы “помечтать” о вероятном решении. Это продуктивнее. Поймав идею код всегда пишется легко сам собою.
  • Никак не могу поймать баланс между говорить и слушать. Проблема усугубляется в ситуации, когда я понимаю, что меня будут как-то оценивать.
  • Собрал пару вопросов, которые надо проработать для будущих интервью. Но, это процесс ожидаемый. Буду работать над этим.
  • Как справиться с тем, что я начинаю решать задачу уже после интервью? Честно говоря я не понимаю как сломать свое сознание и мозг. И надо ли?

Для интервьюеров

  • Ход с просьбой закрыть редактор кода и подумать, меня поразил. Это было сильно. Главное достижение этого интервью. Украл. Спасибо.
  • Мой главный затык никто так и не понял. Пока мы обсуждали технические детали я был полностью погружен в поиск канала взаимодействия сущностей. Им оказалось его отсутствие и использование then внутри all. К этой мысли я пришел не сразу.

Вместо послесловия

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

Редко приходится реализовывать какие-то штуки с нуля, по потребности, без знания внутренней кухни.

Интересно, сколько времени заняло у автора оригинальной реализации Promise.all чтобы придумать как это должно работать? Минуту? Час? Год? Он находился в это время в контексте, или сделал это между прочим, в перерыве на приготовление ужина?

У меня, вне контекста задачи, в условиях стресса первые наработки просочились в сознание минут через 5.

Красивое решение, которое устроило меня самого, около 2 часов.

Тот факт, что уже во время интервью мне удалось сосредоточится и выдать хоть сколько-нибудь логичное предположение о деталях реализации — вызываем у меня внутреннюю гордость за самого себя. Я сделал то, что мне не свойственно. Я прыгнул выше головы. Хвалю сам себя. Молодец.

Но этого конечно не достаточно. Но к счастью сейчас для меня это не критично. Будем работать над этим.

Опыт классный. Познакомился с интересными и приятными людьми. Сделал заметки на полях.

Enjoy with coding!

--

--

Ilya Zykin

IT coach. React and Rails enthusiast. Passionate programmer, caring husband and pancake baker on Sundays. School teacher of computer studies in the past.