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

Понимание задачи

  • Внимательно прочитать условие.

  • Понять что дано, а что требуется?

  • Какие данные есть в задаче и каких типов (входные данные)?

  • Какой результат нужен и какого типа (выходные данные)?

  • Какие действия описаны в задаче?

Разработка решения

Если после прочтения задачи нет четкого представления как решать, сложно сосредоточиться, много мыслей перебивают друг друга, то начните записывать — в коде в комментариях набрасывать план действий или конспектировать мысли, чтобы они больше не крутились в голове. Кому‑то может быть удобнее визуализировать задачу или решение. Для этого держите рядом листок с ручкой или карандашом, чтобы сделать набросок в моменте.

Две вещи, на которых лучше сосредоточиться: всегда есть данные и всегда есть действия над ними. Нужно уметь выделить данные и понять, какие действия нужно над ними совершить. Сложность в том, что действия тоже могут являться данными. Например, задача вызвать функции в определенном порядке. Данные в этой задаче — это функции, а действия — это организовать функции в определенном порядке и вызвать их.

Определить данные

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

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

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

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

В JS есть массив и объект, а связанный список можно реализовать как на основе массива, так и на основе объекта, и в зависимости от этого понадобятся разные действия чтобы пройтись по списку.

Определить действия

Четкое понимание типа данных помогает определить, какие действия понадобятся для преобразования этих данных.

В JS по массиву можно пройтись с помощью циклов или встроенных в массив методов, по объекту можно пройтись с помощью цикла for...in, но иногда удобнее сначала преобразовать его в массив. Почти любое преобразование данных в массиве можно сделать с помощью map, filter или reduce, если вы хорошо их понимаете и нет особых требований по производительности. В ином случае используйте известные вам методы и конструкции.

Действия или функции можно разделить на два типа:

  • Функции‑преобразователи: принимают данные, обрабатывают их и возвращают результат. Данные могут быть любого типа, включая другие функции.

  • Функции‑действия: выполняют определенные действия, такие как вызов других функций по определенной логике, могут ничего не возвращать.

Полезные вопросы:

  • Что должна делать функция? Преобразовать данные или выполнить действия?

  • Есть ли повторяющиеся действия?

  • Что лучше подойдет для повторяющихся действий: цикл или рекурсия?

Отладка решения

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

В случае ошибки нужно внимательно прочитать сообщение об ошибке, если оно доступно. Иначе:

  • Проверить синтаксис:

    • скобки,

    • точки, запятые,

    • названия методов и переменных.

  • Проверить аргументы функции, что должна принимать функция и что она по факту принимает (что дано):

    • количество аргументов,

    • типы аргументов,

    • как достаются аргументы при объявлении функции (используется ли рест оператор, используется ли ключевое слово arguments),

    • как передаются аргументы при вызове функции (используется ли спред оператор, были ли аргументы проброшены через bind, call или apply).

  • Проверить что должна возвращать функция и что она по факту возвращает (что требуется):

    • есть ли return,

    • на том ли уровне он расположен, может это return внутренней функции.

  • Проверить что делает функция (что требуется):

    • какие данные есть и какие у них типы,

    • какие преобразования с ними происходят,

    • правильная ли последовательность операций и вызовов функций,

    • какие логические операторы используются,

    • используется ли в функции контекст, нужно ли его подменить?

Заключение

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

Поделитесь вашими лайфхаками, чек-листами и советами в комментариях.

Буду рад любой обратной связи.

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


  1. amazingname
    16.11.2024 22:18

    Переименуй те статью в "Как джуниору писать тестовое на js чтобы попасть на стажировку".

    Или лучше уберите в черновики.

    Ливкодинг он вообще не об этом.


    1. someden Автор
      16.11.2024 22:18

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


  1. susbox
    16.11.2024 22:18

    Буду рад любой обратной связи.

    Поздравляю, вы освоили базовые принципы работы с chatGPT! Но прямая копипаста в 2024м смотрится слишком откровенно. Я про все эти любимые нейронкой методы структурирования информации, вложенные списки и дефисы (‘—’) .


    1. someden Автор
      16.11.2024 22:18

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


      1. ENick
        16.11.2024 22:18

        Начните с промптов. В 90% случаев, негожие ответы GPT - это проблема задающего вопросы


    1. JohnGear
      16.11.2024 22:18

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


    1. YiLang
      16.11.2024 22:18

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


  1. say_mokc_no
    16.11.2024 22:18

    Вы все ещё решаете задачи на собеседованиях? В приличном обществе таким не занимаются


  1. shsv382
    16.11.2024 22:18

    Обожаю хабр: что-то для джунов? Срочно накидать какашек в панамку!

    З. Ы. Отличная статья для новичков!


    1. amazingname
      16.11.2024 22:18

      Хабр не ресурс для восьмиклассников.


      1. ALEXX4891
        16.11.2024 22:18

        Бедные восьмиклассники, и тут их выгоняют))


  1. duke_alba
    16.11.2024 22:18

    Однажды на собеседовании спросил Java архитекта об элементарных типах в Java. Было весело :-)


  1. sobeskiller
    16.11.2024 22:18

    Зачем вообще задачки на собеседовании? Просто напомню что собеседование при приёме на работу - не экзамен.