
Привет, Хабр! Меня зовут Артём Елизаров, я руковожу отделом разработки фронтальных решений в 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)
Macaronin
17.01.2025 14:35А если у человека два монитора? Зашарить экран уже не спасёт
Ratenti
17.01.2025 14:35Видно будет, что мышку подвинул
The_KOPACb
17.01.2025 14:35Окей, можно ноут рядом поставить
Можно завести виртуалку с пробросом второй Клавы и мышки на втором Монике
Wan-Derer
17.01.2025 14:35Они записывают движение глаз и делают вывод что ты читаешь с другого монитора (так пишут в чатиках).
vigilante
17.01.2025 14:35Никогда не понимал смысл таких задач, как та, что приведена в примере ливкодинга. Какое она отношение имеет к реальной жизни? Я понимаю, что можно проверить тем самым насколько сложный алгоритм будет использован, но, положа руку на сердце, насколько часто вам это требуется от разработчика (даже от синьора)? И если разработчик загуглит не самое удачное решение, но при этом отлично разбирается в построении архитектуры, бережно относится к требованиям, находя оптимальные решения, допускает мало ошибок в работе, он будет понижен в грейде только от того, что не знает как лучше построить алгоритм в данном конкретном случае, который в 99% случаев не будет относится к его работе. Или я ошибаюсь и это это не 99%?
Artyomcool
17.01.2025 14:35Простите, алгоритм? Кажется, любой инженер справится с написанием вот этого куска кода абсолютно механически, даже не подключая мозг. И в этом кажется суть собеседования - узнать, умеет ли человек в принципе нажимать на кнопки таким образом, чтобы из под рук выходил код.
Такие простенькие задачки, на мой взгляд, вполне позволяют это оценить.
Да, конечно, бывает разное, и можно от волнения затупить даже на чем-то элементарном, но нормальный интервьюер поможет справиться с волнением.
BykolajOptoed
17.01.2025 14:35Недавно нанимал водителя, попросил его провезти меня вокруг квартала и параллельную парковку сделать. В ответ получил гневную речь о том, что он не на экзамене по ПДД, что в работе ему это не потребуется, т.к. у компании гараж и что его он зато отлично разбирается в прокладке маршрута и бережно относится к автомобилю :)
Wan-Derer
17.01.2025 14:35По-моему, обычная задача. А что ещё спрашивать на лайве? Я, например, порешали, мне было интересно. Сделал фиговый, не оптимальный вариант. Потом посмотрел коменты к этой статье, переделал. Не всё ж круды вертеть :)
WindMill
17.01.2025 14:35Ну-ну. Книжки читать можно. Гулить можно. ЧатГПТ нельзя. Зато можно вывосанные из пальца задачи, которые со 100% вероятностью никогда не встретятся в реале. Я вот наоборот не беру тех, кто не умеет или отказывается использовать нейросети. С ними и быстрее и качественнее.
YuriyT800
17.01.2025 14:35Точно! Главная цель подобного подхода не выполнение рабочей задачи, а лишь бы сотрудник вы..бался и высушился. А ещё можно запретить любые советы с коллегами. Нехай сами вспоминают и придумывают выход
Andreyika
17.01.2025 14:35Вы согласны с тезисом, что любой ai (в 2024г) может ошибиться, наврать, придумать что либо? Если бы нет, то нафиг те пограмисты нужны - директор пишет промпт в свободной форме и идет в банк за мешком денег от бизнеса
Должен ли работник разбираться в написанном (в т.ч. жпт, ну и скопипащенным с so) не им коде?
Нужно ли это требование проверять на собесе?
Можно ли его проверить иначе, чем кодом без использования чатжпт и копипасты с so (не аналог гугления)?По моему - нет. Можно вместо лайфкодинга "напиши никому не нужный код" дать кусок кода и попросить отрефакторить, найти ошибки.. ну с этим спокойно справится жпт, или не справится и ответит какую-нибудь хрень. А т.к. единого стандарта ответов нет, то прохождение собеса будет зависеть от выбора жпт - если у тебя есть иностранная карточка и ты купил github copilot - ты вот данную задачку прошел, а если у тебя гигачад от сбера - ну извини (или наоборот). Тогда весь собес можно перенести в анкету "Каким жпт вы пользуетесь". А написать задачку, которую не переварит каждый отдельный жпт - ну никто этим не будет заниматься. Поэтому проще - без чатботов.
try1975
17.01.2025 14:35Вот у меня два монитора у компа и ноут можно ещё рядом поставить. Ну пошарю я один из экранов, ну и что? Другое дело, что я не буду пользоваться чатжпт, да и собеседоваться уже, наверное, не буду))
vital_pavlenko
17.01.2025 14:35Когда прохожу собеседования сам, то использую ChatGPT на максимум. И для тестовых и на собеседованиях. Не вижу ни одной причины этого не делать.
Поэтому было бы лицемерием ожидать от кандидата, что он «честный». Если он выполнил задачу самым эффективным образом, то все только в плюсе от этого
YuriyT800
17.01.2025 14:35Это своего рода - принцип-ради принципа. Как в начальной школе - "не списывай у соседа, так не честно".
Но, такие руководители очень выгодны конкурентам. Пока он заставляет персонал "играть по чесноку", а сам играет в образцового HR, конкуренты ставят продукт на конвейер и зарабатывают деньги.
Wan-Derer
17.01.2025 14:35В школе-то как раз правильно заставлять не списывать. Суть школьной задачи не в том чтобы найти конкретное решение (пофиг сколько там у Маши осталось яблок), а в том чтобы научить находить это решение. И списывание в этом никак не поможет.
YuriyT800
17.01.2025 14:35Я вообще-то про то же и толкую. Потому и привел абсурдность данного подхода в компании. Где уже взрослые люди решают совсем иные задачи, на скорость и качество, для заказчика (читай - для заработка себе)
Люди тратили (и тратят) миллионы долларов на промышленный шпионаж. Подкупая и покупая специалистов от конкурентов. Сейчас же эпоха доступности информации открыла доступ к огромному пласту данных. И не пользоваться этим - равносильно идиотизму.
Wan-Derer
17.01.2025 14:35Когда прохожу собеседования сам, то использую ChatGPT
Быстро набираешь вопросы? Или оно их распознаёт прямо с голоса?
oilmonster
17.01.2025 14:35Т.е. задача по поиску персонала тут описывается для людей, которые не умеют работать, но умеют вести диалог и в ливКодинг играться на публику?
Команда ливкодеров-экстравертов?
krovlads
17.01.2025 14:35Возможно они планируют в ОнлиФанс реалити шоу делать с ливкодерами-экстравертами
x012
17.01.2025 14:35Интересно, а если попросить ChatGPT определить - код написан человеком или с помощью ChatGPT - он справиться?
freedomcoder
17.01.2025 14:35Нет, даже специализированные инструменты перестают отличать машинный текст от человеческого. Всё сильно зависит от промпта и выбора LLM - т.е. умения кандидата пользоваться LLM для работы
gun_dose
17.01.2025 14:35Подготовка вопросов для HR
Вот тут у вас корень всех зол. HR должен проводить первичный скрининг кандидатов, а техсобес должен проводить технический специалист. Технический специалист может задать всего один вопрос в стиле "что лучше, сага или санки и почему?". И по рассказу соискателя сразу будет виден весь его опыт и уровень компетенций. А самое главное, что тут 100% кандидат будет отвечать самостоятельно.
Но почему-то все всё равно готовят вопросы в стиле "где у браузера консоль?" или "чем точка с запятой отличается от запятой?", а потом не знают, как по результатам отличить джуна от сеньора.
winkyBrain
17.01.2025 14:35Каждый раз, когда речь заходит об алгоритмических задачах, начинается визг в духе "какое отношение это имеет к реальным задачам?!?!". Почему? Как вы себе это объясняете, когда возмущаетесь?) Вам кто-то перед собеседованием обещал лайвкодинг исключительно с типичными задачами из жизни фронта? А вдруг и правда придётся иногда писать какие-то непростые алгоритмы?
И ещё - какое отношение вы имеете к реальным задачам, если простые алгоритмические задачки на собеседованиях вызывают у вас жопоболь? Возможно никакого?) Или реальные задачи - это только те, которые вас научили решать на недавно оконченных курсах?
Цель подобного лайвкодинга - понять ваш уровень владения базовыми средствами языка и образ мышления. И мелкие алгоритмические задачки прекрасно для этого подходят, особенно нетипичные, которые chatGPT не может решить. Попробуйте поставить себя на место собеседующего и найти способ отсеять так себе разработчиков(всех тех, кто не в состоянии пройти собеседование самостоятельно).
Честно, трудно представить себе человека, который хотя бы с 1+ годом опыта не способен выполнить приведённую в материале задачку за 10 минут. И поводы гореть могут быть только у тех, кто на подобном зафакапился)
xSVPx
17.01.2025 14:35Последние лет двадцать работая в медикал совершенно не понимаю, что хотели получить авторы задачи.
В ответе должны быть какие-то слова ? Не буквосочетания ведь ? Их надо проверять по словарю, где его брать ? Т.е. при входе "абв ваб" должно "" возвращаться ведь ?
В варианте ввода "ааа" ведь должно вернуться "ааа", онож один раз встречается :)?
Или хотелось получить строку состоящую из буквосочетаний разделенных пробелами и включающих только те буквосочетания из первичной строки, которые имеют в своем составе тот же набор букв, который имеет еще хотя бы одно другое буквосочетание ?
Их порядок важен ? Порядок букв в них ? Что такое наборы вообще ? Где это написано ? А может надо сгруппировать все найденные буквосочетания в наборы и показать только те наборы где более одного элемента при этом внутри наборов использовать не пробел, а "-"?
А что делать при повторяющихся буквосочетаниях ? Что делать с вводом типа "ааа ааа", результат должен быть какой ? ""? Null? "ааа"? "ааа-ааа"? Какой-то еще?
Что еще "забыли" сообщить об условиях, и как можно решить задачу по столь неполному ТЗ?
Работа будет так же организована ? Пойди туда, не знаю куда, сделай то, не знаю что ?
Ratenti
17.01.2025 14:35Это проверяет способность кандидата понять, когда нужно попросить уточнить ТЗ
xSVPx
17.01.2025 14:35Какие угодно косяки в процессе собеседования можно объяснить тестом на стрессоустойчивость :).
Проверяет ли это способность кандидата встать и сразу шваркнуть дверью, ведь работать с людьми, которые с порога подсовывают дефектные ТЗ "на реализацию" вряд ли конструктивно ?
Человеку вроде бы кодировать прям предлагают, а не ТЗ исправлять... это как по мне сильно разное... Такие ТЗ не должны до исполнителей доходить, и если нужны скиллы "как с таким работать", значит в консерватории что-то крупно "не так".
Ratenti
17.01.2025 14:35На собеседованиях же часто задают вопросы с подвохом.
xSVPx
17.01.2025 14:35И в этом нет ничего хорошего. Инженеры всё-таки не солдаты, им надо решать задачи хорошо, а не в стрессе и под давлением.
Но одно дело мандгеймсы, другое когда тебе тест предлагают. Для интервьюера это тест как будет работать соискатель, а для соискателя это тест какие ТЗ он будет получать...
Хотите проверять алгоритмические задачи, проверяйте. Но если вместо этого выходит проверка "что будет делать соискатель когда ТЗ говно", то что-то явно не так.... Крупно не так.
northrop
17.01.2025 14:35Угу, а потом кандидат начнет вот такую увлекательную игру в вопросы, вместо того, чтобы сделать то, что нужно: https://pikabu.ru/story/idet_muzhik_po_ulitse_smotrit_novyiy_magazin_day_dumaet_zaydu_91793
Ваши предложения как не вляпаться в такую ситуацию?
1755
17.01.2025 14:35Ну давайте сразу на шейдерах писать задачки, там много интересных алгоритмов есть и результаты прикольные можно получить. Пофиг что это такое же специфичное знание, зато кандидату можно говорить что ему не место в работе.
Думаю, стоит разделять кодинг и алгоритмические интервью. А если брать что-то алгоритмическое, то точно понимать насколько это будет коррелировать с тем что человек будет делать в работе, а не с тем что у него хобби решать задачки на литкоде
Glamych
17.01.2025 14:35Есть прога на нейронке, позволяющие человеку всегда смотреть в камеру. Включаешь и под столом с мобилы гпт-шишь вопросы. Слава богу я из айти давно свалил, каждый раз диву даюсь с тестовых заданий.
И да, LLM-моделей сейчас вагон и маленькая тележка, многие из которых код пишут и оптимизируют так, как мидлам не снилось.
Hheimerd
17.01.2025 14:35Шел 2025 год, а на собеседованиях все ещё спрашивают про let/var и классовые компоненты. Может ещё про jquery вопросики будут?
Arioch
17.01.2025 14:35если программист берется, чтобы с нуля написать Hello World на модном последние полгода (в обоих смыслах) фреймворке - то это действительно не нужно.
а вот если на работу над программой, которая существует несколько лет, и в которой может быть всякое, да даже просто забыть и let и var и использовать переменную без объявления.
и потом такому программисту дают задание найти и исправить ошибку, а он в принципе даже гипотезы выдвинуть не может, как ошибка может случиться, потому что не знает тех самых скучных основ языка и его слабых мест
...но когда задачи сводятся к "напиши за два дня сайт с 10 страничками, мы его сразу продадим и забудем навсегда" - то конечно это всё лишнее.
Dhwtj
17.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 проверить
Dhwtj
17.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. :)
Dhwtj
17.01.2025 14:35Ну, вообще-то `useState`, `useEffect` я и имел в виду как отдельные инструменты.
Var / let, передача параметров в реакт и жизненный цикл компонентов это я ошибся, да
В ООП объект сам управляет своими свойствами.
В React иммутабельные пропсы /свойства управляются родителем и передаются дочернему компоненту сверху вниз (в соответствии с концепцией однонаправленного потока данных в React
Вот так, не будучи фронтэндером можно получить 6/10 или 7/10 если будут уточняющие вопросы. А почему я прав по вопросу #6? А потому что хук не принадлежит компоненту
jz36
17.01.2025 14:35Браво! Приятно увидеть такой подробный ответ. Как в старые добрые времена - читать комменты может быть не менее полезно, чем статью :)
n0isy
17.01.2025 14:35То есть люди не поняли что ответ на ответ дал чатгпт. И кто то мне на хабре пытается сказать, что за ИИ нет будущего.
jz36
17.01.2025 14:35Ну я так не говорил точно) просто одно дело - потенциальная информация, на которую chatGPT может потенциально ответить, а другой дело - написанный текст, который заиндексируется и поможет следующим поколениям)
ainoneko
17.01.2025 14:35А что на собеседование скажут кандидату, который заметит, что "мутабельный метод" не самое удачное выражение?
(Обычно "мутабельный" -- это то, что может изменяться, а не изменять.)
Dhwtj
17.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);
ну что же, красиво! Но менее читаемо
Dhwtj
17.01.2025 14:35Я просто оставлю это здесь©
getAnagramsLazy = filter ((> 1) . length) . group . sortBy (compare `on` sort) . words
tyllo
17.01.2025 14:35что за
<some array>.groupBy
?Dhwtj
17.01.2025 14:35https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy
Недавно появилось в JS, примерно год. В typescript ещё нет вроде, но можно и самому написать.
А в c# уже лет 10 как
А в SQL с рождения
tyllo
17.01.2025 14:35В моем комментарии был упор на
<some array
> - которого не существует, если не патчить прототип массива.
kivan_mih
17.01.2025 14:35У меня тоже одно время была ситуация, когда 2-3 собеседования в день были нормой и иногда даже больше. Я от этого устал и уже 10 лет даю тестовые задания на входе до собеседования, а на самом собеседовании примерно половину времени посвящаю разбору тестового и прошу что-то в нем доделать или поменять. Статистика за всё это время в разные компании у меня примерно одинаковая: присылают решение тестовых примерно треть кандидатов из тех, кто был изначально заинтересован в вакансии, из них еще в 50% случаев сразу понятно, что говорить не о чем. В итоге собеседование я провожу примерно с 15% от исходного потока кандидатов из которых реально проходят собеседование примерно треть. Итог: из примерно 20 желающих в итоге нанимаю одного.
Мне повезло, я могу себе это позволить, поскольку всегда ханчу в небольшие команды и под свое руководство. Мне часто говорят, что таким образом я срезаю много толковых людей, кто не хочет делать тестовое. И я не спорю, для меня если человек не готов делать тестовое, значит он недостаточно мотивирован, хотя с профессиональной стороны он может быть на порядок сильнее, чем человек, которого я в конце концов найму. Обычно люди нанятые таким образом прекрасно вписываются в команду и достаточно хорошо мотивированы в том числе и для того, чтобы профессионально расти.
Когда речь идёт о потоковом найме в десятки команд и необходимости идти на "необходимые" компромисы - не завидую людям, кто этим занимается, и конечно лидам команд, куда приходят люди после такого потокового найма.
Dhwtj
17.01.2025 14:35Главное, чтоб тестовое задание не занимало больше часа
Wan-Derer
17.01.2025 14:35Пол-дня в выходной вполне можно потратить если вакуха вкусная. А то и целый день.
kivan_mih
17.01.2025 14:35тестовое обычно можно по-разному сделать приложив разное количество усилий, это не просто алгоритмическая задача. Обычно 4-6 часов раньше занимало у людей, сейчас с AI скорее всего быстрее.
oilmonster
17.01.2025 14:35Тяжко нанимать? Научись релевантно описывать вакансию для кандидата. Утверждать что твоя схема привлекает более мотивированных людей - ошибка!
kivan_mih
17.01.2025 14:35Не ошибается тот, кто ничего не делает :) Что касается мотивации у меня были ситуации, когда без тестового на входе приходили толковые люди и уходили через 3 месяца, а вот с введением тестового минимальное время, которое человек работал после найма - это полтора года. Связано ли это с тестовым или нет, не знаю, стат тесты не проводил, но интуитивно кажется, что связано. Помимо мотивации сделанное тестовое задание по моему опыту еще коррелирует с низкой конфликтностью людей, это тоже может влиять на длительность последующей работы. Так что ошибка или не ошибка - это как обычно с какой стороны посмотреть.
Про тяжесть найма - за 10 лет, которые я набираю с тестовым, ни разу не было, чтобы непосредственно поиск занимал бы дольше полутора месяцев.
Mox
А как вы соединяете redux-tookit и effector? Или это в разных проектах?
prodota
У нас redux-tookit и effector используются на разных проектах.