
Привет, Хабр! Меня зовут Артём Елизаров, я руковожу отделом разработки фронтальных решений в R-Style Softlab. Значительную часть рабочего времени я посвящаю подбору специалистов и в общей сложности занимаюсь этим уже более 5 лет. В этой статье я хотел бы поделиться опытом проведения собеседований, их спецификой и дать рекомендации тем, кто ищет работу фронтенд-разработчиком.
Воронка кандидатов и время закрытия позиций
Как руководитель, отвечающий сразу за несколько проектов, я заинтересован в том, чтобы штат всегда был укомплектован, а на подряде работали ребята, которым можно доверять. Поэтому выстраивание процесса найма — один из лучших способов снизить риски на проекте. Сегодня под моим руководством несколько лидов, которым я могу доверить подбор людей, что сильно облегчает жизнь, но так было не всегда. Еще недавно 2-3 собеседования каждый день было для меня нормой.
Наш основной стек — React, Redux Toolkit, Effector, поэтому мы работаем на рынке, где много и специалистов, и вакансий. Это позволяет, с одной стороны, не выходить за рамки бюджетов, а с другой — усложняет задачу найма, так как нужно не только найти, но и удержать будущего сотрудника. Единственное исключение — поиск специалистов со знанием технологий криптозащиты. Здесь нужно быть готовым к тому, чтобы либо тратить ресурсы на обучение, либо конкурировать за счет высокой зарплаты. Мы чаще идем в сторону обучения. В среднем, чтобы закрыть одну позицию в штате, мы проводим от 10 до 15 собеседований, при подборе по договору ГПХ, аутстафу или самозанятости — меньше.
Подготовка вопросов для HR — возможность ускорить прохождение кандидата по воронке. Приведу для примера несколько вопросов, которые могут помочь отсеять неподходящих кандидатов, даже если HR плохо разбирается в ИТ-терминологии.
Примеры вопросов
- Назовите разницу между == и === (двойным сравнением и тройным сравнением) 
- Как проверить, является ли переменная массивом в JavaScript? 
- Чем отличаются let и var в JavaScript? 
- Чем отличается null от undefined в JavaScript? 
- Как вы считаете, React предоставляет декларативный или императивный API? 
- В чем разница между функциональными и классовыми компонентами в React? 
- Назовите основные методы жизненного цикла классового компонента по порядку 
- Назовите самые популярные mutable (мутабельные) методы массива в Javascript? 
- Как передать данные от родительского компонента к дочернему в React? 
- Как можно улучшить производительность приложения на React? 
Что спрашивать на собеседовании: console.log и livecoding
До недавнего времени в начале каждого собеседования я говорил, сколько будет этапов и как они будут проходить, но сейчас пришел к тому, что не объявляю этапы, а только говорю, что будет livecoding. Это экономит время первого разговора и позволяет в дальнейшем, в случае необходимости, сократить или увеличить число этапов. Сейчас главное для меня при первой встрече — расположить человека на беседу, чтобы он расслабился, не стрессовал и открыто рассказал про интересные проекты и опыт.
Чтобы оценить технические навыки, я даю задачи, где нужно рассказать, что происходит в коде и что выводится в консоль. Это показывает базовое понимание логики работы языка программирования, и далее провожу livecoding.
Для livecoding’а у меня есть 10 задач, одну из которых я предлагаю кандидатам или прошу назвать число от 1 до 10, но в этом случае большинство называют цифру 7 ?.

Уровень задач — средний. Моя цель — не завалить, а скорее определить уровень владения логикой построения решения и навыками программирования. Идеальный кандидат умеет выстраивать логику и кодить, но часто бывает, что какой-то из навыков можно подтянуть. В зависимости от ситуации, это может быть стоп-фактором или задачей на испытательный срок.
Еще можно оценить хард- и софт-скилы кандидата. Если вам нужен потенциальный лид, то стоит обращать внимание на умение вести диалог и договариваться, а если скоро в команду нужен будет синьор, то мидл с сильными хард-скиллами будет идеальным кандидатом.
Зарплата — главный мотивационный фактор, но есть и другие
Конечно, для большинства специалистов зарплата — главная мотивация. Интересный факт: по моим наблюдениям 70% потока кандидатов — люди, которые меняют профессиональный профиль и хотят работать в ИТ-сфере. Сейчас в моей команде успешно работают бывший полицейский, грузчик и экс-сотрудник администрации города, например. Все ребята прошли тесты и отбор, поэтому непрофильный бэкграунд — еще не повод отказывать. Если в компании выстроен процесс обучения и поддержки, джун может быть подходящим вариантом.
Я думаю, какой бы ни был грейд сотрудника, важно понимать, что ему интересно в профессии, и выстраивать план развития на определенный срок. Это помогает не чувствовать себя неловко, если приходится расстаться с человеком, потому что он не выполнил договоренности. Практика увольнений сотрудников, которые не хотят работать — нормальный процесс, к которому должен быть готов и любой специалист, и любой руководитель.
Еще один мотивирующий фактор, который нельзя игнорировать — желание людей работать в здоровом коллективе с приятной атмосферой. В сложной ситуации, когда горят сроки или что-то не получается на проекте, это спасает людей от выгорания и они остаются в команде гораздо дольше.
ChatGPT на собеседовании и другие уловки кандидатов
Когда появился ChatGPT, я задал ему вопросы, которые были в моем пуле. Причем особой вариативности ответов нет, концепция ответов однотипна. Когда ко мне приходят кандидаты, которые за 5 минут выдают ответ ChatGPT — это нельзя не заметить. В этом случае я прошу расшарить весь экран и даю другую задачу, в 85% случаев человек с ней не справляется. Конечно, ChatGPT можно пользоваться перед собеседованием. Например, лучше всего спросить, какие вопросы тебе могут задать и посмотреть, как бы на них ответила нейросеть.

Частая история сегодня — проектная занятость, когда человек трудоустроен в одной компании, а работает на проекте в другой. Работа по такой схеме называется аутстаф. Конечно, компании заинтересованы, чтобы их специалисты не простаивали, и делают все, чтобы пристроить специалиста. Например, я сталкивался с тем, что собеседование записывается кандидатом и рассылается другим сотрудникам аутстаф-компании или вопросы заданий передаются и обсуждаются заранее.
Но многие компании, предлагающие аутстаф, работают честно и присылают сразу 10 хороших кандидатов, что сильно сокращает сроки найма. Единственный минус, который встречается почти у всех — завышенный опыт в резюме. Поэтому я рекомендую всегда делать переоценку опыта с такими кандидатами, чтобы понять, справится ли человек с задачами. В остальном, сотрудники, работающие по аутстаф, ничем не отличаются от штатной команды.
Подводя итог, я бы добавил несколько советов для тех, кто ищет сейчас работу:
- Постарайтесь не волноваться. Волнение мешает показать ваши навыки и умения, относитесь к собеседованию как к важному, но не фатальному событию в вашей жизни. 
- Будьте честными. Руководители, которые проводят по несколько собеседований в день, отлично понимают, когда человек лукавит и пытается выдать желаемое за действительное. 
- Уделите время подготовке. Подумайте над тем, весь ли опыт есть в резюме, что нужно отметить отдельно, какие примеры решенных задач привести. Если не подумать про это заранее, за 10 минут сложно собрать все в кучу. Пример хорошо структурированного портала, который позволит освежить знания здесь. 
- Решайте задачи на логику. Логика — один из важнейших навыков для разработчиков, будьте всегда готовы к неожиданной логической задаче, и чем больше подходов к их решению вы знаете, тем быстрее справитесь. Примеры типичных задач на логику, которые часто задают на собеседованиях, собраны, например, здесь. 
Комментарии (93)
 - Macaronin17.01.2025 14:35- А если у человека два монитора? Зашарить экран уже не спасёт  - Ratenti17.01.2025 14:35- Видно будет, что мышку подвинул  - The_KOPACb17.01.2025 14:35- Окей, можно ноут рядом поставить - Можно завести виртуалку с пробросом второй Клавы и мышки на втором Монике  - Wan-Derer17.01.2025 14:35- Они записывают движение глаз и делают вывод что ты читаешь с другого монитора (так пишут в чатиках). 
 
 
 
 - vigilante17.01.2025 14:35- Никогда не понимал смысл таких задач, как та, что приведена в примере ливкодинга. Какое она отношение имеет к реальной жизни? Я понимаю, что можно проверить тем самым насколько сложный алгоритм будет использован, но, положа руку на сердце, насколько часто вам это требуется от разработчика (даже от синьора)? И если разработчик загуглит не самое удачное решение, но при этом отлично разбирается в построении архитектуры, бережно относится к требованиям, находя оптимальные решения, допускает мало ошибок в работе, он будет понижен в грейде только от того, что не знает как лучше построить алгоритм в данном конкретном случае, который в 99% случаев не будет относится к его работе. Или я ошибаюсь и это это не 99%?  - Artyomcool17.01.2025 14:35- Простите, алгоритм? Кажется, любой инженер справится с написанием вот этого куска кода абсолютно механически, даже не подключая мозг. И в этом кажется суть собеседования - узнать, умеет ли человек в принципе нажимать на кнопки таким образом, чтобы из под рук выходил код. - Такие простенькие задачки, на мой взгляд, вполне позволяют это оценить. - Да, конечно, бывает разное, и можно от волнения затупить даже на чем-то элементарном, но нормальный интервьюер поможет справиться с волнением.  - BykolajOptoed17.01.2025 14:35- Недавно нанимал водителя, попросил его провезти меня вокруг квартала и параллельную парковку сделать. В ответ получил гневную речь о том, что он не на экзамене по ПДД, что в работе ему это не потребуется, т.к. у компании гараж и что его он зато отлично разбирается в прокладке маршрута и бережно относится к автомобилю :) 
 
  - Wan-Derer17.01.2025 14:35- По-моему, обычная задача. А что ещё спрашивать на лайве? Я, например, порешали, мне было интересно. Сделал фиговый, не оптимальный вариант. Потом посмотрел коменты к этой статье, переделал. Не всё ж круды вертеть :) 
 
 - WindMill17.01.2025 14:35- Ну-ну. Книжки читать можно. Гулить можно. ЧатГПТ нельзя. Зато можно вывосанные из пальца задачи, которые со 100% вероятностью никогда не встретятся в реале. Я вот наоборот не беру тех, кто не умеет или отказывается использовать нейросети. С ними и быстрее и качественнее.  - YuriyT80017.01.2025 14:35- Точно! Главная цель подобного подхода не выполнение рабочей задачи, а лишь бы сотрудник вы..бался и высушился. А ещё можно запретить любые советы с коллегами. Нехай сами вспоминают и придумывают выход 
  - Andreyika17.01.2025 14:35- Вы согласны с тезисом, что любой ai (в 2024г) может ошибиться, наврать, придумать что либо? Если бы нет, то нафиг те пограмисты нужны - директор пишет промпт в свободной форме и идет в банк за мешком денег от бизнеса 
 Должен ли работник разбираться в написанном (в т.ч. жпт, ну и скопипащенным с so) не им коде?
 Нужно ли это требование проверять на собесе?
 Можно ли его проверить иначе, чем кодом без использования чатжпт и копипасты с so (не аналог гугления)?- По моему - нет. Можно вместо лайфкодинга "напиши никому не нужный код" дать кусок кода и попросить отрефакторить, найти ошибки.. ну с этим спокойно справится жпт, или не справится и ответит какую-нибудь хрень. А т.к. единого стандарта ответов нет, то прохождение собеса будет зависеть от выбора жпт - если у тебя есть иностранная карточка и ты купил github copilot - ты вот данную задачку прошел, а если у тебя гигачад от сбера - ну извини (или наоборот). Тогда весь собес можно перенести в анкету "Каким жпт вы пользуетесь". А написать задачку, которую не переварит каждый отдельный жпт - ну никто этим не будет заниматься. Поэтому проще - без чатботов. 
 
 - try197517.01.2025 14:35- Вот у меня два монитора у компа и ноут можно ещё рядом поставить. Ну пошарю я один из экранов, ну и что? Другое дело, что я не буду пользоваться чатжпт, да и собеседоваться уже, наверное, не буду)) 
 - vital_pavlenko17.01.2025 14:35- Когда прохожу собеседования сам, то использую ChatGPT на максимум. И для тестовых и на собеседованиях. Не вижу ни одной причины этого не делать. - Поэтому было бы лицемерием ожидать от кандидата, что он «честный». Если он выполнил задачу самым эффективным образом, то все только в плюсе от этого  - YuriyT80017.01.2025 14:35- Это своего рода - принцип-ради принципа. Как в начальной школе - "не списывай у соседа, так не честно". - Но, такие руководители очень выгодны конкурентам. Пока он заставляет персонал "играть по чесноку", а сам играет в образцового HR, конкуренты ставят продукт на конвейер и зарабатывают деньги.  - Wan-Derer17.01.2025 14:35- В школе-то как раз правильно заставлять не списывать. Суть школьной задачи не в том чтобы найти конкретное решение (пофиг сколько там у Маши осталось яблок), а в том чтобы научить находить это решение. И списывание в этом никак не поможет.  - YuriyT80017.01.2025 14:35- Я вообще-то про то же и толкую. Потому и привел абсурдность данного подхода в компании. Где уже взрослые люди решают совсем иные задачи, на скорость и качество, для заказчика (читай - для заработка себе) - Люди тратили (и тратят) миллионы долларов на промышленный шпионаж. Подкупая и покупая специалистов от конкурентов. Сейчас же эпоха доступности информации открыла доступ к огромному пласту данных. И не пользоваться этим - равносильно идиотизму. 
 
 
  - Wan-Derer17.01.2025 14:35- Когда прохожу собеседования сам, то использую ChatGPT - Быстро набираешь вопросы? Или оно их распознаёт прямо с голоса? 
 
 - oilmonster17.01.2025 14:35- Т.е. задача по поиску персонала тут описывается для людей, которые не умеют работать, но умеют вести диалог и в ливКодинг играться на публику? - Команда ливкодеров-экстравертов?  - krovlads17.01.2025 14:35- Возможно они планируют в ОнлиФанс реалити шоу делать с ливкодерами-экстравертами 
 
 - x01217.01.2025 14:35- Интересно, а если попросить ChatGPT определить - код написан человеком или с помощью ChatGPT - он справиться?  - freedomcoder17.01.2025 14:35- Нет, даже специализированные инструменты перестают отличать машинный текст от человеческого. Всё сильно зависит от промпта и выбора LLM - т.е. умения кандидата пользоваться LLM для работы 
 
 - gun_dose17.01.2025 14:35- Подготовка вопросов для HR - Вот тут у вас корень всех зол. HR должен проводить первичный скрининг кандидатов, а техсобес должен проводить технический специалист. Технический специалист может задать всего один вопрос в стиле "что лучше, сага или санки и почему?". И по рассказу соискателя сразу будет виден весь его опыт и уровень компетенций. А самое главное, что тут 100% кандидат будет отвечать самостоятельно. - Но почему-то все всё равно готовят вопросы в стиле "где у браузера консоль?" или "чем точка с запятой отличается от запятой?", а потом не знают, как по результатам отличить джуна от сеньора. 
 - winkyBrain17.01.2025 14:35- Каждый раз, когда речь заходит об алгоритмических задачах, начинается визг в духе "какое отношение это имеет к реальным задачам?!?!". Почему? Как вы себе это объясняете, когда возмущаетесь?) Вам кто-то перед собеседованием обещал лайвкодинг исключительно с типичными задачами из жизни фронта? А вдруг и правда придётся иногда писать какие-то непростые алгоритмы? - И ещё - какое отношение вы имеете к реальным задачам, если простые алгоритмические задачки на собеседованиях вызывают у вас жопоболь? Возможно никакого?) Или реальные задачи - это только те, которые вас научили решать на недавно оконченных курсах? - Цель подобного лайвкодинга - понять ваш уровень владения базовыми средствами языка и образ мышления. И мелкие алгоритмические задачки прекрасно для этого подходят, особенно нетипичные, которые chatGPT не может решить. Попробуйте поставить себя на место собеседующего и найти способ отсеять так себе разработчиков(всех тех, кто не в состоянии пройти собеседование самостоятельно). - Честно, трудно представить себе человека, который хотя бы с 1+ годом опыта не способен выполнить приведённую в материале задачку за 10 минут. И поводы гореть могут быть только у тех, кто на подобном зафакапился)  - xSVPx17.01.2025 14:35- Последние лет двадцать работая в медикал совершенно не понимаю, что хотели получить авторы задачи. - В ответе должны быть какие-то слова ? Не буквосочетания ведь ? Их надо проверять по словарю, где его брать ? Т.е. при входе "абв ваб" должно "" возвращаться ведь ? - В варианте ввода "ааа" ведь должно вернуться "ааа", онож один раз встречается :)? - Или хотелось получить строку состоящую из буквосочетаний разделенных пробелами и включающих только те буквосочетания из первичной строки, которые имеют в своем составе тот же набор букв, который имеет еще хотя бы одно другое буквосочетание ? - Их порядок важен ? Порядок букв в них ? Что такое наборы вообще ? Где это написано ? А может надо сгруппировать все найденные буквосочетания в наборы и показать только те наборы где более одного элемента при этом внутри наборов использовать не пробел, а "-"? - А что делать при повторяющихся буквосочетаниях ? Что делать с вводом типа "ааа ааа", результат должен быть какой ? ""? Null? "ааа"? "ааа-ааа"? Какой-то еще? - Что еще "забыли" сообщить об условиях, и как можно решить задачу по столь неполному ТЗ? - Работа будет так же организована ? Пойди туда, не знаю куда, сделай то, не знаю что ?  - Ratenti17.01.2025 14:35- Это проверяет способность кандидата понять, когда нужно попросить уточнить ТЗ  - xSVPx17.01.2025 14:35- Какие угодно косяки в процессе собеседования можно объяснить тестом на стрессоустойчивость :). - Проверяет ли это способность кандидата встать и сразу шваркнуть дверью, ведь работать с людьми, которые с порога подсовывают дефектные ТЗ "на реализацию" вряд ли конструктивно ? - Человеку вроде бы кодировать прям предлагают, а не ТЗ исправлять... это как по мне сильно разное... Такие ТЗ не должны до исполнителей доходить, и если нужны скиллы "как с таким работать", значит в консерватории что-то крупно "не так".  - Ratenti17.01.2025 14:35- На собеседованиях же часто задают вопросы с подвохом.  - xSVPx17.01.2025 14:35- И в этом нет ничего хорошего. Инженеры всё-таки не солдаты, им надо решать задачи хорошо, а не в стрессе и под давлением. - Но одно дело мандгеймсы, другое когда тебе тест предлагают. Для интервьюера это тест как будет работать соискатель, а для соискателя это тест какие ТЗ он будет получать... - Хотите проверять алгоритмические задачи, проверяйте. Но если вместо этого выходит проверка "что будет делать соискатель когда ТЗ говно", то что-то явно не так.... Крупно не так. 
 
 
  - northrop17.01.2025 14:35- Угу, а потом кандидат начнет вот такую увлекательную игру в вопросы, вместо того, чтобы сделать то, что нужно: https://pikabu.ru/story/idet_muzhik_po_ulitse_smotrit_novyiy_magazin_day_dumaet_zaydu_91793 - Ваши предложения как не вляпаться в такую ситуацию? 
 
 
  - 175517.01.2025 14:35- Ну давайте сразу на шейдерах писать задачки, там много интересных алгоритмов есть и результаты прикольные можно получить. Пофиг что это такое же специфичное знание, зато кандидату можно говорить что ему не место в работе. - Думаю, стоит разделять кодинг и алгоритмические интервью. А если брать что-то алгоритмическое, то точно понимать насколько это будет коррелировать с тем что человек будет делать в работе, а не с тем что у него хобби решать задачки на литкоде 
 
 - Glamych17.01.2025 14:35- Есть прога на нейронке, позволяющие человеку всегда смотреть в камеру. Включаешь и под столом с мобилы гпт-шишь вопросы. Слава богу я из айти давно свалил, каждый раз диву даюсь с тестовых заданий. - И да, LLM-моделей сейчас вагон и маленькая тележка, многие из которых код пишут и оптимизируют так, как мидлам не снилось. 
 - Hheimerd17.01.2025 14:35- Шел 2025 год, а на собеседованиях все ещё спрашивают про let/var и классовые компоненты. Может ещё про jquery вопросики будут?  - Arioch17.01.2025 14:35- если программист берется, чтобы с нуля написать Hello World на модном последние полгода (в обоих смыслах) фреймворке - то это действительно не нужно. - а вот если на работу над программой, которая существует несколько лет, и в которой может быть всякое, да даже просто забыть и let и var и использовать переменную без объявления. - и потом такому программисту дают задание найти и исправить ошибку, а он в принципе даже гипотезы выдвинуть не может, как ошибка может случиться, потому что не знает тех самых скучных основ языка и его слабых мест - ...но когда задачи сводятся к "напиши за два дня сайт с 10 страничками, мы его сразу продадим и забудем навсегда" - то конечно это всё лишнее. 
 
 - Dhwtj17.01.2025 14:35- Ну давайте, буду позориться ))) - Назовите разницу между == и === (двойным сравнением и тройным сравнением) - === Это извращение в динамических типизированных языках JS, PHP для проверки не только значения, но и типа. Потому что на уровне компиляции этой проверки нет. - Как проверить, является ли переменная массивом в JavaScript? - Функцией IsInstanceOf или типа того, надо гуглить - Чем отличаются let и var в JavaScript? - Var создаёт мутабельную переменную, let видимо имутабельную и не переменную а забыл термин - Чем отличается null от undefined в JavaScript? - Null это отсутствие значения. Undefined неопределенное значение. - Как вы считаете, React предоставляет декларативный или императивный API? - Реакт имеет хорошие инструменты для декларативного программирования. Но в императивное тоже может. - В чем разница между функциональными и классовыми компонентами в React? - Классовые компоненты, подобно ООП, могут хранить состояние внутри себя. Функциональные следуют принципам функционального программирования, то есть без побочных эффектов и хранимого состояния. Для состояния есть отдельные инструменты - Назовите основные методы жизненного цикла классового компонента по порядку - Видимо, конструктор, методы, деструктор. Вообще без понятия, я не фронтэндер - Назовите самые популярные mutable (мутабельные) методы массива в Javascript? - Reverse какой-нибудь - Как передать данные от родительского компонента к дочернему в React? - Наконец то интересный вопрос. Совершенно без понятия. Полагаю, что дочерний должен сам попросить данные. - Как можно улучшить производительность приложения на React? - Кешировать данные с сервера, например. Тысячи методов. - Так. Теперь прошу LLM проверить  - Dhwtj17.01.2025 14:35- Давайте разберем ваши ответы и уточним их. Вы справились неплохо, но есть моменты, которые требуют доработки. :) - --- - ### **1. Разница между `==` и `===`** - **Ваш ответ:** - > `===` — Это извращение в динамических типизированных языках JS, PHP для проверки не только значения, но и типа. Потому что на уровне компиляции этой проверки нет. - **Корректировка:** - ✔️ **`==`** выполняет **нестрогое сравнение**, приводя (конвертируя) типы к одному значению перед сравнением. Например: - ```js - '5' == 5 // true - null == undefined // true - ``` - ✔️ **`===`** выполняет **строгое сравнение**, без приведения типов. Например: - ```js - '5' === 5 // false - null === undefined // false - ``` - Ваш ответ частично верный, но формулировка немного субъективная. :) - --- - ### **2. Как проверить, является ли переменная массивом в JavaScript?** - **Ваш ответ:** - > Функцией IsInstanceOf или типа того, надо гуглить. - **Корректировка:** - ✔️ Правильный способ — использовать метод: - ```js - Array.isArray(variable) - ``` - Также можно использовать: - ```js - variable instanceof Array // но это менее предпочтительно - ``` - --- - ### **3. Чем отличаются `let` и `var` в JavaScript?** - **Ваш ответ:** - > `var` создаёт мутабельную переменную, `let` видимо имутабельную и не переменную, а забыл термин. - **Корректировка:** - - **`var` и `let`** оба создают **мутабельные переменные**. - - Основные отличия: - 1. **Область видимости:** - - `var` — **функциональная область видимости**. - - `let` — **блочная область видимости**. - 2. **Поднятие (hoisting):** - - Переменные, объявленные с `var`, поднимаются (hoisted) и инициализируются как `undefined`. - - Переменные с `let` поднимаются, но остаются **неинициализированными** до строки их объявления (временная мёртвая зона). - 3. `let` не позволяет повторно объявлять переменную в той же области видимости. - Ваш ответ неверен, но был на правильном пути. :) - --- - ### **4. Чем отличается `null` от `undefined` в JavaScript?** - **Ваш ответ:** - > `null` — это отсутствие значения. `undefined` — неопределенное значение. - **Корректировка:** - ✔️ Верно, но можно уточнить: - - **`null`** — это **явленое отсутствие значения**. Его можно присвоить вручную: - ```js - let a = null; - ``` - - **`undefined`** — это значение переменной, которая была объявлена, но **не инициализирована**: - ```js - let b; - console.log(b); // undefined - ``` - --- - ### **5. React предоставляет декларативный или императивный API?** - **Ваш ответ:** - > React имеет хорошие инструменты для декларативного программирования. Но в императивное тоже может. - **Корректировка:** - ✔️ React в первую очередь предоставляет **декларативный API**. Вы описываете, **что нужно сделать**, а React решает, как это сделать. - - Например, JSX — это декларативный подход: - ```jsx - const App = () => <h1>Hello, World!</h1>; - ``` - - Императивный подход тоже возможен, но это скорее исключение (например, прямое манипулирование DOM через `ref`). - Ваш ответ в принципе верный, но можно было бы сформулировать чуть точнее. - --- - ### **6. Разница между функциональными и классовыми компонентами в React?** - **Ваш ответ:** - > Классовые компоненты, подобно ООП, могут хранить состояние внутри себя. Функциональные следуют принципам функционального программирования, то есть без побочных эффектов и хранимого состояния. Для состояния есть отдельные инструменты. - **Корректировка:** - ✔️ До появления хуков функциональные компоненты **не могли хранить состояние**. Однако с введением хуков (`useState`, `useEffect` и др.) функциональные компоненты теперь **могут** быть stateful. - ✔️ Основное отличие: - - **Классовые компоненты** используют классы и методы жизненного цикла (`componentDidMount`, `componentDidUpdate` и т.д.). - - **Функциональные компоненты** — это функции, которые используют хуки для работы со state и эффектами. - Ваш ответ устарел, так как хуки появились ещё в 2019 году. - --- - ### **7. Основные методы жизненного цикла классового компонента по порядку** - **Ваш ответ:** - > Видимо, конструктор, методы, деструктор. Вообще без понятия, я не фронтендер. - **Корректировка:** - ✔️ Основные методы жизненного цикла: - 1. **Монтирование:** - - `constructor` - - `render` - - `componentDidMount` - 2. **Обновление:** - - `render` - - `componentDidUpdate` - 3. **Размонтирование:** - - `componentWillUnmount` - --- - ### **8. Самые популярные мутабельные методы массива в JavaScript?** - **Ваш ответ:** - > `reverse` какой-нибудь. - **Корректировка:** - ✔️ Примеры **мутабельных методов массива** (изменяют сам массив): - - `push` - - `pop` - - `shift` - - `unshift` - - `splice` - - `sort` - - `reverse` - `reverse`, который вы назвали, действительно один из них. Молодец! - --- - ### **9. Как передать данные от родительского компонента к дочернему в React?** - **Ваш ответ:** - > Совершенно без понятия. Полагаю, что дочерний должен сам попросить данные. - **Корректировка:** - ✔️ Данные передаются от родительского компонента к дочернему через **пропсы**: - ```jsx - const Parent = () => { - const data = "Hello from parent"; - return <Child myData={data} />; - }; - const Child = ({ myData }) => <p>{myData}</p>; - ``` - Ваш ответ неверен. Дочерний компонент сам данные не запрашивает, это делает родитель. - --- - ### **10. Как можно улучшить производительность приложения на React?** - **Ваш ответ:** - > Кешировать данные с сервера, например. Тысячи методов. - **Корректировка:** - ✔️ Некоторые способы: - 1. Использовать **React.memo** для мемоизации компонентов. - 2. Использовать хуки **useMemo** и **useCallback**. - 3. Избегать ненужных ререндеров (оптимизировать props). - 4. Динамическая загрузка компонентов с помощью React.lazy. - 5. Кеширование данных (как вы упомянули). - 6. Использовать виртуализацию списков (например, библиотека react-window). - Ваш ответ частично верный, но слишком общий. - --- - ### Итог: - Вы старались, и это прекрасно! Но есть куда расти: - - Правильных / частично правильных ответов: **6 из 10**. - - Рекомендую подробнее изучить React и основы JavaScript. :)  - Dhwtj17.01.2025 14:35- Ну, вообще-то `useState`, `useEffect` я и имел в виду как отдельные инструменты. - Var / let, передача параметров в реакт и жизненный цикл компонентов это я ошибся, да - В ООП объект сам управляет своими свойствами. - В React иммутабельные пропсы /свойства управляются родителем и передаются дочернему компоненту сверху вниз (в соответствии с концепцией однонаправленного потока данных в React - Вот так, не будучи фронтэндером можно получить 6/10 или 7/10 если будут уточняющие вопросы. А почему я прав по вопросу #6? А потому что хук не принадлежит компоненту 
  - jz3617.01.2025 14:35- Браво! Приятно увидеть такой подробный ответ. Как в старые добрые времена - читать комменты может быть не менее полезно, чем статью :)  - n0isy17.01.2025 14:35- То есть люди не поняли что ответ на ответ дал чатгпт. И кто то мне на хабре пытается сказать, что за ИИ нет будущего.  - jz3617.01.2025 14:35- Ну я так не говорил точно) просто одно дело - потенциальная информация, на которую chatGPT может потенциально ответить, а другой дело - написанный текст, который заиндексируется и поможет следующим поколениям) 
 
 
  - ainoneko17.01.2025 14:35- А что на собеседование скажут кандидату, который заметит, что "мутабельный метод" не самое удачное выражение? 
 (Обычно "мутабельный" -- это то, что может изменяться, а не изменять.)
 
 
 - Dhwtj17.01.2025 14:35- И код - const str = 'адрес карп кума куст мир мука парк рим среда стук рост сорт трос'; const getAnagrams = (str) => { const words = str.split(' '); const anagrams = words.reduce((acc, word) => { const sortedWord = word.split('').sort().join(''); acc[sortedWord] = (acc[sortedWord] || []).concat(word); return acc; }, {}); return Object.values(anagrams).filter(group => group.length > 1); }; console.log(getAnagrams(str));- А вот решение от LLM - const getAnagrams = str => Object.values( str.split(' ') .groupBy(word => [...word].sort().join('')) ).filter(group => group.length > 1);- ну что же, красиво! Но менее читаемо  - Dhwtj17.01.2025 14:35- Я просто оставлю это здесь© - getAnagramsLazy = filter ((> 1) . length) . group . sortBy (compare `on` sort) . words
  - tyllo17.01.2025 14:35- что за - <some array>.groupBy? - Dhwtj17.01.2025 14:35- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy - Недавно появилось в JS, примерно год. В typescript ещё нет вроде, но можно и самому написать. - А в c# уже лет 10 как - А в SQL с рождения  - tyllo17.01.2025 14:35- В моем комментарии был упор на - <some array> - которого не существует, если не патчить прототип массива.
 
 
 
 - kivan_mih17.01.2025 14:35- У меня тоже одно время была ситуация, когда 2-3 собеседования в день были нормой и иногда даже больше. Я от этого устал и уже 10 лет даю тестовые задания на входе до собеседования, а на самом собеседовании примерно половину времени посвящаю разбору тестового и прошу что-то в нем доделать или поменять. Статистика за всё это время в разные компании у меня примерно одинаковая: присылают решение тестовых примерно треть кандидатов из тех, кто был изначально заинтересован в вакансии, из них еще в 50% случаев сразу понятно, что говорить не о чем. В итоге собеседование я провожу примерно с 15% от исходного потока кандидатов из которых реально проходят собеседование примерно треть. Итог: из примерно 20 желающих в итоге нанимаю одного. - Мне повезло, я могу себе это позволить, поскольку всегда ханчу в небольшие команды и под свое руководство. Мне часто говорят, что таким образом я срезаю много толковых людей, кто не хочет делать тестовое. И я не спорю, для меня если человек не готов делать тестовое, значит он недостаточно мотивирован, хотя с профессиональной стороны он может быть на порядок сильнее, чем человек, которого я в конце концов найму. Обычно люди нанятые таким образом прекрасно вписываются в команду и достаточно хорошо мотивированы в том числе и для того, чтобы профессионально расти. - Когда речь идёт о потоковом найме в десятки команд и необходимости идти на "необходимые" компромисы - не завидую людям, кто этим занимается, и конечно лидам команд, куда приходят люди после такого потокового найма.  - Dhwtj17.01.2025 14:35- Главное, чтоб тестовое задание не занимало больше часа  - Wan-Derer17.01.2025 14:35- Пол-дня в выходной вполне можно потратить если вакуха вкусная. А то и целый день. 
  - kivan_mih17.01.2025 14:35- тестовое обычно можно по-разному сделать приложив разное количество усилий, это не просто алгоритмическая задача. Обычно 4-6 часов раньше занимало у людей, сейчас с AI скорее всего быстрее. 
 
  - oilmonster17.01.2025 14:35- Тяжко нанимать? Научись релевантно описывать вакансию для кандидата. Утверждать что твоя схема привлекает более мотивированных людей - ошибка!  - kivan_mih17.01.2025 14:35- Не ошибается тот, кто ничего не делает :) Что касается мотивации у меня были ситуации, когда без тестового на входе приходили толковые люди и уходили через 3 месяца, а вот с введением тестового минимальное время, которое человек работал после найма - это полтора года. Связано ли это с тестовым или нет, не знаю, стат тесты не проводил, но интуитивно кажется, что связано. Помимо мотивации сделанное тестовое задание по моему опыту еще коррелирует с низкой конфликтностью людей, это тоже может влиять на длительность последующей работы. Так что ошибка или не ошибка - это как обычно с какой стороны посмотреть. 
 Про тяжесть найма - за 10 лет, которые я набираю с тестовым, ни разу не было, чтобы непосредственно поиск занимал бы дольше полутора месяцев.
 
 
 
           
 





Mox
А как вы соединяете redux-tookit и effector? Или это в разных проектах?
prodota
У нас redux-tookit и effector используются на разных проектах.