При решении задач на собеседовании кандидаты часто волнуются и упускают из вида полезные мелочи, которые могут помочь в понимании задачи, разработке решения или в поиске ошибок. Чек-листы и советы из этой статьи помогут сосредоточиться на нужных деталях.
Понимание задачи
Внимательно прочитать условие.
Понять что дано, а что требуется?
Какие данные есть в задаче и каких типов (входные данные)?
Какой результат нужен и какого типа (выходные данные)?
Какие действия описаны в задаче?
Разработка решения
Если после прочтения задачи нет четкого представления как решать, сложно сосредоточиться, много мыслей перебивают друг друга, то начните записывать — в коде в комментариях набрасывать план действий или конспектировать мысли, чтобы они больше не крутились в голове. Кому‑то может быть удобнее визуализировать задачу или решение. Для этого держите рядом листок с ручкой или карандашом, чтобы сделать набросок в моменте.
Две вещи, на которых лучше сосредоточиться: всегда есть данные и всегда есть действия над ними. Нужно уметь выделить данные и понять, какие действия нужно над ними совершить. Сложность в том, что действия тоже могут являться данными. Например, задача вызвать функции в определенном порядке. Данные в этой задаче — это функции, а действия — это организовать функции в определенном порядке и вызвать их.
Определить данные
Для лучшего представления решения, поможет формулирование условия другими словами. Если не понятна фраза «перебрать список», то попробовать подобрать синоним, например, «пройтись по массиву», возможно после этого появятся идеи, как написать код.
Бывают синонимы действий: перебрать массив, пройтись по списку, преобразовать набор данных и т. д. И бывают синонимы данных: массив, набор, список, очередь, куча, объект и т. д. Нужно понять какой тип данных из языка понадобится для представления этих данных.
Простые типы данных, например, числа и строки есть почти в каждом языке и обычно понятно как их представить в коде и как преобразовывать. Можно создать переменную с числом и совершать с ней математические операции.
Но сложные типы или составные данные бывают по разному представлены в разных языках.
В JS есть массив и объект, а связанный список можно реализовать как на основе массива, так и на основе объекта, и в зависимости от этого понадобятся разные действия чтобы пройтись по списку.
Определить действия
Четкое понимание типа данных помогает определить, какие действия понадобятся для преобразования этих данных.
В JS по массиву можно пройтись с помощью циклов или встроенных в массив методов, по объекту можно пройтись с помощью цикла for...in
, но иногда удобнее сначала преобразовать его в массив. Почти любое преобразование данных в массиве можно сделать с помощью map
, filter
или reduce
, если вы хорошо их понимаете и нет особых требований по производительности. В ином случае используйте известные вам методы и конструкции.
Действия или функции можно разделить на два типа:
Функции‑преобразователи: принимают данные, обрабатывают их и возвращают результат. Данные могут быть любого типа, включая другие функции.
Функции‑действия: выполняют определенные действия, такие как вызов других функций по определенной логике, могут ничего не возвращать.
Полезные вопросы:
Что должна делать функция? Преобразовать данные или выполнить действия?
Есть ли повторяющиеся действия?
Что лучше подойдет для повторяющихся действий: цикл или рекурсия?
Отладка решения
По опыту проведения собеседований, больше волнения возникает на этом этапе. Когда кандидат написал, как ему казалось, рабочее решение, но получил ошибку или некорректный результат. Кто‑то в такие моменты впадает в ступор, кто‑то начинает действовать методом тыка и еще дальше уходит от правильного решения. Чтобы не терять время и не запутать себя, предлагаю следующий план.
В случае ошибки нужно внимательно прочитать сообщение об ошибке, если оно доступно. Иначе:
-
Проверить синтаксис:
скобки,
точки, запятые,
названия методов и переменных.
-
Проверить аргументы функции, что должна принимать функция и что она по факту принимает (что дано):
количество аргументов,
типы аргументов,
как достаются аргументы при объявлении функции (используется ли рест оператор, используется ли ключевое слово arguments),
как передаются аргументы при вызове функции (используется ли спред оператор, были ли аргументы проброшены через bind, call или apply).
-
Проверить что должна возвращать функция и что она по факту возвращает (что требуется):
есть ли return,
на том ли уровне он расположен, может это return внутренней функции.
-
Проверить что делает функция (что требуется):
какие данные есть и какие у них типы,
какие преобразования с ними происходят,
правильная ли последовательность операций и вызовов функций,
какие логические операторы используются,
используется ли в функции контекст, нужно ли его подменить?
Заключение
Сохраните себе чек-листы и советы, которые показались полезными, поправьте под свой язык, добавьте свои пункты и подсматривайте в них на собеседовании, чтобы не дать волнению скрыть ваши реальные знания и опыт.
Поделитесь вашими лайфхаками, чек-листами и советами в комментариях.
Буду рад любой обратной связи.
Комментарии (13)
susbox
16.11.2024 22:18Буду рад любой обратной связи.
Поздравляю, вы освоили базовые принципы работы с chatGPT! Но прямая копипаста в 2024м смотрится слишком откровенно. Я про все эти любимые нейронкой методы структурирования информации, вложенные списки и дефисы (‘—’) .
someden Автор
16.11.2024 22:18Благодарю, но освоение пока еще в процессе. Ответ chatGPT на эту тему не устроил, даже когда я переслал ему большую часть текста и попросил структурировать. Он как раз предлагал без вложенных списков. А дефисы расставляет новый WYSIWYG-редактор Хабра.
ENick
16.11.2024 22:18Начните с промптов. В 90% случаев, негожие ответы GPT - это проблема задающего вопросы
JohnGear
16.11.2024 22:18дам Вам небольшой лайфхак, коллега. Вы можете безструктурно набросать свои умные мысли по любому поводу (поток сознания так сказать), а потом закинуть в условный chatGPT и попросить стрктурировать и упорядочить информацию. Поверьте, Вы будете удивлены результату, но это по прежнему будут Ваши авторские мысли.
YiLang
16.11.2024 22:18Всю жизнь использую вложенные списки и обмазываю это Markdown до всех этих ваших нейросетей. Кстати, взял такую практику именно после чтения статей на Хабре.
say_mokc_no
16.11.2024 22:18Вы все ещё решаете задачи на собеседованиях? В приличном обществе таким не занимаются
shsv382
16.11.2024 22:18Обожаю хабр: что-то для джунов? Срочно накидать какашек в панамку!
З. Ы. Отличная статья для новичков!
duke_alba
16.11.2024 22:18Однажды на собеседовании спросил Java архитекта об элементарных типах в Java. Было весело :-)
sobeskiller
16.11.2024 22:18Зачем вообще задачки на собеседовании? Просто напомню что собеседование при приёме на работу - не экзамен.
amazingname
Переименуй те статью в "Как джуниору писать тестовое на js чтобы попасть на стажировку".
Или лучше уберите в черновики.
Ливкодинг он вообще не об этом.
someden Автор
Согласен, информация актуальнее для джунов, но на своих собесах встречаю в основном мидлов, которым приходится задавать вопросы или давать подсказки описанные в статье.