Привет, Хабр! Меня зовут Артём Елизаров, я руковожу отделом разработки фронтальных решений в 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 ?. 

Пример задачи для livecoding’а
Пример задачи для livecoding’а

Уровень задач — средний. Моя цель — не завалить, а скорее определить уровень владения логикой построения решения и навыками программирования. Идеальный кандидат умеет выстраивать логику и кодить, но часто бывает, что какой-то из навыков можно подтянуть. В зависимости от ситуации, это может быть стоп-фактором или задачей на испытательный срок. 

Еще можно оценить хард- и софт-скилы кандидата. Если вам нужен потенциальный лид, то стоит обращать внимание на умение вести диалог и договариваться, а если скоро в команду нужен будет синьор, то мидл с сильными хард-скиллами будет идеальным кандидатом. 

Зарплата — главный мотивационный фактор, но есть и другие 

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

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

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

ChatGPT на собеседовании и другие уловки кандидатов 

Когда появился ChatGPT, я задал ему вопросы, которые были в моем пуле. Причем особой вариативности ответов нет, концепция ответов однотипна. Когда ко мне приходят кандидаты, которые за 5 минут выдают ответ ChatGPT — это нельзя не заметить. В этом случае я прошу расшарить весь экран и даю другую задачу, в 85% случаев человек с ней не справляется. Конечно, ChatGPT можно пользоваться перед собеседованием. Например, лучше всего спросить, какие вопросы тебе могут задать и посмотреть, как бы на них ответила нейросеть. 

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

Но многие компании, предлагающие аутстаф, работают честно и присылают сразу 10 хороших кандидатов, что сильно сокращает сроки найма. Единственный минус, который встречается почти у всех — завышенный опыт в резюме. Поэтому я рекомендую всегда делать переоценку опыта с такими кандидатами, чтобы понять, справится ли человек с задачами. В остальном, сотрудники, работающие по аутстаф, ничем не отличаются от штатной команды. 

Подводя итог, я бы добавил несколько советов для тех, кто ищет сейчас работу: 

  1. Постарайтесь не волноваться. Волнение мешает показать ваши навыки и умения, относитесь к собеседованию как к важному, но не фатальному событию в вашей жизни. 

  2. Будьте честными. Руководители, которые проводят по несколько собеседований в день, отлично понимают, когда человек лукавит и пытается выдать желаемое за действительное. 

  3. Уделите время подготовке. Подумайте над тем, весь ли опыт есть в резюме, что нужно отметить отдельно, какие примеры решенных задач привести. Если не подумать про это заранее, за 10 минут сложно собрать все в кучу. Пример хорошо структурированного портала, который позволит освежить знания здесь

  4. Решайте задачи на логику. Логика — один из важнейших навыков для разработчиков, будьте всегда готовы к неожиданной логической задаче, и чем больше подходов к их решению вы знаете, тем быстрее справитесь. Примеры типичных задач на логику, которые часто задают на собеседованиях, собраны, например, здесь.  

Комментарии (93)


  1. Mox
    17.01.2025 14:35

    А как вы соединяете redux-tookit и effector? Или это в разных проектах?


    1. prodota
      17.01.2025 14:35

      У нас redux-tookit и effector используются на разных проектах.


  1. sneg2015
    17.01.2025 14:35

    Статья написанная сотрудником с помощью chatgpt обличает сотрудников с chatgpt)


    1. selkwind
      17.01.2025 14:35

      Кто злейший враг эмигранта ? Предыдущий эмигрант


  1. Macaronin
    17.01.2025 14:35

    А если у человека два монитора? Зашарить экран уже не спасёт


    1. travacry
      17.01.2025 14:35

      ну так это уже программист


    1. Ratenti
      17.01.2025 14:35

      Видно будет, что мышку подвинул


      1. The_KOPACb
        17.01.2025 14:35

        Окей, можно ноут рядом поставить

        Можно завести виртуалку с пробросом второй Клавы и мышки на втором Монике


        1. Wan-Derer
          17.01.2025 14:35

          Они записывают движение глаз и делают вывод что ты читаешь с другого монитора (так пишут в чатиках).


          1. n3td0g
            17.01.2025 14:35

            У Nvidia есть нейронка, которая позволяет скрыть движение глаз )


          1. The_KOPACb
            17.01.2025 14:35

            оооокей, 2 компа ( ноут подойдёт ) и режим picture in picture на монике


  1. AzaBroflovski
    17.01.2025 14:35

    AI slop


  1. vigilante
    17.01.2025 14:35

    Никогда не понимал смысл таких задач, как та, что приведена в примере ливкодинга. Какое она отношение имеет к реальной жизни? Я понимаю, что можно проверить тем самым насколько сложный алгоритм будет использован, но, положа руку на сердце, насколько часто вам это требуется от разработчика (даже от синьора)? И если разработчик загуглит не самое удачное решение, но при этом отлично разбирается в построении архитектуры, бережно относится к требованиям, находя оптимальные решения, допускает мало ошибок в работе, он будет понижен в грейде только от того, что не знает как лучше построить алгоритм в данном конкретном случае, который в 99% случаев не будет относится к его работе. Или я ошибаюсь и это это не 99%?


    1. Artyomcool
      17.01.2025 14:35

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

      Такие простенькие задачки, на мой взгляд, вполне позволяют это оценить.

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


      1. BykolajOptoed
        17.01.2025 14:35

        Недавно нанимал водителя, попросил его провезти меня вокруг квартала и параллельную парковку сделать. В ответ получил гневную речь о том, что он не на экзамене по ПДД, что в работе ему это не потребуется, т.к. у компании гараж и что его он зато отлично разбирается в прокладке маршрута и бережно относится к автомобилю :)


    1. Wan-Derer
      17.01.2025 14:35

      По-моему, обычная задача. А что ещё спрашивать на лайве? Я, например, порешали, мне было интересно. Сделал фиговый, не оптимальный вариант. Потом посмотрел коменты к этой статье, переделал. Не всё ж круды вертеть :)


  1. WindMill
    17.01.2025 14:35

    Ну-ну. Книжки читать можно. Гулить можно. ЧатГПТ нельзя. Зато можно вывосанные из пальца задачи, которые со 100% вероятностью никогда не встретятся в реале. Я вот наоборот не беру тех, кто не умеет или отказывается использовать нейросети. С ними и быстрее и качественнее.


    1. YuriyT800
      17.01.2025 14:35

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


    1. Andreyika
      17.01.2025 14:35

      Вы согласны с тезисом, что любой ai (в 2024г) может ошибиться, наврать, придумать что либо? Если бы нет, то нафиг те пограмисты нужны - директор пишет промпт в свободной форме и идет в банк за мешком денег от бизнеса
      Должен ли работник разбираться в написанном (в т.ч. жпт, ну и скопипащенным с so) не им коде?
      Нужно ли это требование проверять на собесе?
      Можно ли его проверить иначе, чем кодом без использования чатжпт и копипасты с so (не аналог гугления)?

      По моему - нет. Можно вместо лайфкодинга "напиши никому не нужный код" дать кусок кода и попросить отрефакторить, найти ошибки.. ну с этим спокойно справится жпт, или не справится и ответит какую-нибудь хрень. А т.к. единого стандарта ответов нет, то прохождение собеса будет зависеть от выбора жпт - если у тебя есть иностранная карточка и ты купил github copilot - ты вот данную задачку прошел, а если у тебя гигачад от сбера - ну извини (или наоборот). Тогда весь собес можно перенести в анкету "Каким жпт вы пользуетесь". А написать задачку, которую не переварит каждый отдельный жпт - ну никто этим не будет заниматься. Поэтому проще - без чатботов.


  1. try1975
    17.01.2025 14:35

    Вот у меня два монитора у компа и ноут можно ещё рядом поставить. Ну пошарю я один из экранов, ну и что? Другое дело, что я не буду пользоваться чатжпт, да и собеседоваться уже, наверное, не буду))


    1. Wan-Derer
      17.01.2025 14:35

      собеседоваться уже, наверное, не буду

      Потому что сам собеседуешь? :)


      1. Kuros1
        17.01.2025 14:35

        Как одно мешает другому?


  1. vital_pavlenko
    17.01.2025 14:35

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

    Поэтому было бы лицемерием ожидать от кандидата, что он «честный». Если он выполнил задачу самым эффективным образом, то все только в плюсе от этого


    1. YuriyT800
      17.01.2025 14:35

      Это своего рода - принцип-ради принципа. Как в начальной школе - "не списывай у соседа, так не честно".

      Но, такие руководители очень выгодны конкурентам. Пока он заставляет персонал "играть по чесноку", а сам играет в образцового HR, конкуренты ставят продукт на конвейер и зарабатывают деньги.


      1. Wan-Derer
        17.01.2025 14:35

        В школе-то как раз правильно заставлять не списывать. Суть школьной задачи не в том чтобы найти конкретное решение (пофиг сколько там у Маши осталось яблок), а в том чтобы научить находить это решение. И списывание в этом никак не поможет.


        1. YuriyT800
          17.01.2025 14:35

          Я вообще-то про то же и толкую. Потому и привел абсурдность данного подхода в компании. Где уже взрослые люди решают совсем иные задачи, на скорость и качество, для заказчика (читай - для заработка себе)

          Люди тратили (и тратят) миллионы долларов на промышленный шпионаж. Подкупая и покупая специалистов от конкурентов. Сейчас же эпоха доступности информации открыла доступ к огромному пласту данных. И не пользоваться этим - равносильно идиотизму.


    1. Wan-Derer
      17.01.2025 14:35

      Когда прохожу собеседования сам, то использую ChatGPT

      Быстро набираешь вопросы? Или оно их распознаёт прямо с голоса?


  1. oilmonster
    17.01.2025 14:35

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

    Команда ливкодеров-экстравертов?


    1. krovlads
      17.01.2025 14:35

      Возможно они планируют в ОнлиФанс реалити шоу делать с ливкодерами-экстравертами


    1. Wan-Derer
      17.01.2025 14:35

      По-моему,canLivecoding.isPartOf(canWork).Не?


  1. x012
    17.01.2025 14:35

    Интересно, а если попросить ChatGPT определить - код написан человеком или с помощью ChatGPT - он справиться?


    1. freedomcoder
      17.01.2025 14:35

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


  1. gun_dose
    17.01.2025 14:35

    Подготовка вопросов для HR

    Вот тут у вас корень всех зол. HR должен проводить первичный скрининг кандидатов, а техсобес должен проводить технический специалист. Технический специалист может задать всего один вопрос в стиле "что лучше, сага или санки и почему?". И по рассказу соискателя сразу будет виден весь его опыт и уровень компетенций. А самое главное, что тут 100% кандидат будет отвечать самостоятельно.

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


  1. winkyBrain
    17.01.2025 14:35

    Каждый раз, когда речь заходит об алгоритмических задачах, начинается визг в духе "какое отношение это имеет к реальным задачам?!?!". Почему? Как вы себе это объясняете, когда возмущаетесь?) Вам кто-то перед собеседованием обещал лайвкодинг исключительно с типичными задачами из жизни фронта? А вдруг и правда придётся иногда писать какие-то непростые алгоритмы?

    И ещё - какое отношение вы имеете к реальным задачам, если простые алгоритмические задачки на собеседованиях вызывают у вас жопоболь? Возможно никакого?) Или реальные задачи - это только те, которые вас научили решать на недавно оконченных курсах?

    Цель подобного лайвкодинга - понять ваш уровень владения базовыми средствами языка и образ мышления. И мелкие алгоритмические задачки прекрасно для этого подходят, особенно нетипичные, которые chatGPT не может решить. Попробуйте поставить себя на место собеседующего и найти способ отсеять так себе разработчиков(всех тех, кто не в состоянии пройти собеседование самостоятельно).

    Честно, трудно представить себе человека, который хотя бы с 1+ годом опыта не способен выполнить приведённую в материале задачку за 10 минут. И поводы гореть могут быть только у тех, кто на подобном зафакапился)


    1. xSVPx
      17.01.2025 14:35

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

      В ответе должны быть какие-то слова ? Не буквосочетания ведь ? Их надо проверять по словарю, где его брать ? Т.е. при входе "абв ваб" должно "" возвращаться ведь ?

      В варианте ввода "ааа" ведь должно вернуться "ааа", онож один раз встречается :)?

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

      Их порядок важен ? Порядок букв в них ? Что такое наборы вообще ? Где это написано ? А может надо сгруппировать все найденные буквосочетания в наборы и показать только те наборы где более одного элемента при этом внутри наборов использовать не пробел, а "-"?

      А что делать при повторяющихся буквосочетаниях ? Что делать с вводом типа "ааа ааа", результат должен быть какой ? ""? Null? "ааа"? "ааа-ааа"? Какой-то еще?

      Что еще "забыли" сообщить об условиях, и как можно решить задачу по столь неполному ТЗ?

      Работа будет так же организована ? Пойди туда, не знаю куда, сделай то, не знаю что ?


      1. Ratenti
        17.01.2025 14:35

        Это проверяет способность кандидата понять, когда нужно попросить уточнить ТЗ


        1. xSVPx
          17.01.2025 14:35

          Какие угодно косяки в процессе собеседования можно объяснить тестом на стрессоустойчивость :).

          Проверяет ли это способность кандидата встать и сразу шваркнуть дверью, ведь работать с людьми, которые с порога подсовывают дефектные ТЗ "на реализацию" вряд ли конструктивно ?

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


          1. Ratenti
            17.01.2025 14:35

            На собеседованиях же часто задают вопросы с подвохом.


            1. xSVPx
              17.01.2025 14:35

              И в этом нет ничего хорошего. Инженеры всё-таки не солдаты, им надо решать задачи хорошо, а не в стрессе и под давлением.

              Но одно дело мандгеймсы, другое когда тебе тест предлагают. Для интервьюера это тест как будет работать соискатель, а для соискателя это тест какие ТЗ он будет получать...

              Хотите проверять алгоритмические задачи, проверяйте. Но если вместо этого выходит проверка "что будет делать соискатель когда ТЗ говно", то что-то явно не так.... Крупно не так.


        1. northrop
          17.01.2025 14:35

          Угу, а потом кандидат начнет вот такую увлекательную игру в вопросы, вместо того, чтобы сделать то, что нужно: https://pikabu.ru/story/idet_muzhik_po_ulitse_smotrit_novyiy_magazin_day_dumaet_zaydu_91793

          Ваши предложения как не вляпаться в такую ситуацию?


      1. Dhwtj
        17.01.2025 14:35

        Имеет смысл договориться о контрольных примерах. На leetcode они всегда есть


        1. ainoneko
          17.01.2025 14:35

          Это и будет уточнение задания на формальном языке (на том же JS): начать с написания тестов :)


    1. 1755
      17.01.2025 14:35

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

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


  1. Glamych
    17.01.2025 14:35

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

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


    1. Ratenti
      17.01.2025 14:35

      В видео же не сказано, что там видеосвязь была вообще


  1. Hheimerd
    17.01.2025 14:35

    Шел 2025 год, а на собеседованиях все ещё спрашивают про let/var и классовые компоненты. Может ещё про jquery вопросики будут?


    1. Ratenti
      17.01.2025 14:35

      База всегда актуальна


    1. Dhwtj
      17.01.2025 14:35

      jquery дрянь, а уж в сочетании с active form и active record так дважды дрянь


    1. Arioch
      17.01.2025 14:35

      если программист берется, чтобы с нуля написать Hello World на модном последние полгода (в обоих смыслах) фреймворке - то это действительно не нужно.

      а вот если на работу над программой, которая существует несколько лет, и в которой может быть всякое, да даже просто забыть и let и var и использовать переменную без объявления.

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

      ...но когда задачи сводятся к "напиши за два дня сайт с 10 страничками, мы его сразу продадим и забудем навсегда" - то конечно это всё лишнее.


  1. Ratenti
    17.01.2025 14:35

    Как расшаривание экрана помешает пользоваться chatgpt с телефона?


  1. 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 проверить


    1. 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. :)


      1. Dhwtj
        17.01.2025 14:35

        Ну, вообще-то `useState`, `useEffect` я и имел в виду как отдельные инструменты.

        Var / let, передача параметров в реакт и жизненный цикл компонентов это я ошибся, да

        В ООП объект сам управляет своими свойствами.

        В React иммутабельные пропсы /свойства управляются родителем и передаются дочернему компоненту сверху вниз (в соответствии с концепцией однонаправленного потока данных в React

        Вот так, не будучи фронтэндером можно получить 6/10 или 7/10 если будут уточняющие вопросы. А почему я прав по вопросу #6? А потому что хук не принадлежит компоненту


      1. jz36
        17.01.2025 14:35

        Браво! Приятно увидеть такой подробный ответ. Как в старые добрые времена - читать комменты может быть не менее полезно, чем статью :)


        1. Dhwtj
          17.01.2025 14:35

          Слова дёшевы, покажи код©


        1. n0isy
          17.01.2025 14:35

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


          1. jz36
            17.01.2025 14:35

            Ну я так не говорил точно) просто одно дело - потенциальная информация, на которую chatGPT может потенциально ответить, а другой дело - написанный текст, который заиндексируется и поможет следующим поколениям)


      1. ainoneko
        17.01.2025 14:35

        А что на собеседование скажут кандидату, который заметит, что "мутабельный метод" не самое удачное выражение?
        (Обычно "мутабельный" -- это то, что может изменяться, а не изменять.)


  1. 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);

    ну что же, красиво! Но менее читаемо


    1. Dhwtj
      17.01.2025 14:35

      Я просто оставлю это здесь©

      getAnagramsLazy = filter ((> 1) . length) . group . sortBy (compare `on` sort) . words


      1. Wan-Derer
        17.01.2025 14:35

        А это на каком языке? :|


        1. Dhwtj
          17.01.2025 14:35

          Haskell

          Точечная нотация. Читать справа налево. И учесть что строка там это массив букв. Соответственно, sort сортирует буквы в каждом слове.


    1. tyllo
      17.01.2025 14:35

      что за <some array>.groupBy?


      1. Dhwtj
        17.01.2025 14:35

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy

        Недавно появилось в JS, примерно год. В typescript ещё нет вроде, но можно и самому написать.

        А в c# уже лет 10 как

        А в SQL с рождения


        1. tyllo
          17.01.2025 14:35

          В моем комментарии был упор на <some array> - которого не существует, если не патчить прототип массива.


  1. kivan_mih
    17.01.2025 14:35

    У меня тоже одно время была ситуация, когда 2-3 собеседования в день были нормой и иногда даже больше. Я от этого устал и уже 10 лет даю тестовые задания на входе до собеседования, а на самом собеседовании примерно половину времени посвящаю разбору тестового и прошу что-то в нем доделать или поменять. Статистика за всё это время в разные компании у меня примерно одинаковая: присылают решение тестовых примерно треть кандидатов из тех, кто был изначально заинтересован в вакансии, из них еще в 50% случаев сразу понятно, что говорить не о чем. В итоге собеседование я провожу примерно с 15% от исходного потока кандидатов из которых реально проходят собеседование примерно треть. Итог: из примерно 20 желающих в итоге нанимаю одного.

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

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


    1. Dhwtj
      17.01.2025 14:35

      Главное, чтоб тестовое задание не занимало больше часа


      1. Wan-Derer
        17.01.2025 14:35

        Пол-дня в выходной вполне можно потратить если вакуха вкусная. А то и целый день.


      1. kivan_mih
        17.01.2025 14:35

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


    1. oilmonster
      17.01.2025 14:35

      Тяжко нанимать? Научись релевантно описывать вакансию для кандидата. Утверждать что твоя схема привлекает более мотивированных людей - ошибка!


      1. kivan_mih
        17.01.2025 14:35

        Не ошибается тот, кто ничего не делает :) Что касается мотивации у меня были ситуации, когда без тестового на входе приходили толковые люди и уходили через 3 месяца, а вот с введением тестового минимальное время, которое человек работал после найма - это полтора года. Связано ли это с тестовым или нет, не знаю, стат тесты не проводил, но интуитивно кажется, что связано. Помимо мотивации сделанное тестовое задание по моему опыту еще коррелирует с низкой конфликтностью людей, это тоже может влиять на длительность последующей работы. Так что ошибка или не ошибка - это как обычно с какой стороны посмотреть.
        Про тяжесть найма - за 10 лет, которые я набираю с тестовым, ни разу не было, чтобы непосредственно поиск занимал бы дольше полутора месяцев.