Это плохая практика собеседования, когда кандидаты пишут реализацию связного списка? [закрыто]

43

Читая этот сайт и ТАК, я видел много историй вопросов и ответов на собеседования, в которых говорилось, что кандидат должен был создать связанный список с нуля. Обычно это упражнение «дай мне» для кандидатов на роль в программировании, таких как написание FizzBuzz. Идея состоит в том, что если кандидат не может этого сделать, он не может программировать и должен быть отклонен почти сразу.

Тем не менее, я не могу не думать, что это может быть плохой практикой по следующим причинам:

  • Современные языки высокого уровня, такие как C # и Python, широко используют списки; написание собственного объекта связанного списка потребовалось бы только при необычных обстоятельствах и даже тогда, вероятно, опрометчиво.
  • Языки более низкого уровня, такие как C ++, имеют стандартные библиотеки с контейнерами итераторов / списков и объектами.
  • В свете первых двух пунктов кодеры могут идти годами, даже не задумываясь о реализации списка (связанного, двусвязного и т. Д.). Некоторые могут даже не видеть такие вещи со времен колледжа.
  • Вычислительная мощность также не является фактором, который был несколько лет назад, поэтому эффективность с помощью указателей не является проблемой, которой она была (в целом).
  • Простой веб-поиск чего-то вроде «связанного списка» привел бы к множеству примеров кода, которые можно было бы просто запомнить и выплюнуть, не указывая на истинную компетенцию кандидата.

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

Я думаю, что этот двоичный подход «нет кода связанного списка, нет работы» для программистов, работающих над настольным компьютером или веб-приложением, несколько устарел. Это также может быть довольно вредно; кандидат, который не может вспомнить, как правильно работать с главой списка, может быть отличным программистом и коллегой и потеряться в миксе. Мысли?

РЕДАКТИРОВАТЬ : Есть много (хороших) комментариев, предполагающих, что это хороший или плохой вопрос, зависит от контекста работы. Я полностью согласен, поэтому позвольте мне перефразировать этот вопрос: реализация связанного списка - это распространенный вопрос интервью для широкого круга заданий по кодированию, аналогичный таким вопросам, как FizzBuzz или написание рекурсивной функции для вычисления факториалов. Достаточно ли полезен этот вопрос, чтобы его можно было широко использовать для оценки кандидатов на программирование по всем направлениям? Или следует считать плохим вопрос, за исключением должностей «Старший разработчик, команда встроенных связанных списков»?

joshin4colours
источник
11
На какую должность это? Что это за работа? В каком домене это находится?
Томас Оуэнс
1
Я вижу ваши правки, но все же - что это за работа? Это стажировка? Работа начального уровня? Промежуточная работа? Вы ищете нанять программиста, инженера или ученого? В каком домене это находится? Будут ли они когда-либо в таком положении, что им по какой-либо причине потребуется развернуть свои собственные алгоритмы или структуры данных?
Томас Оуэнс
3
«C # (...) естественное использование списков» и «эффективность с помощью указателей - это не та проблема, с которой он был раньше»: вы знаете, что эти «родные» списки - не связанные списки, а списки, основанные на массивах? Массивы имеют тенденцию работать лучше из-за кэширования. Фактически, IIRC .NET Framework даже не имел связанных списков до 2.0. Я почти уверен, что большинство программ на C # не используют связанные списки.
Алекс тен Бринк
1
@AlextenBrink Интересно, я думаю, это означает, что знание связанного списка еще менее важно для C #. Зачем реализовывать структуру данных самостоятельно (с возможными ошибками), когда я могу использовать лучшую структуру, встроенную прямо в язык?
joshin4colours
Вопрос, который я имею в виду, заключается в следующем: «Почему бы даже рассмотреть возможность использования структуры данных, которая почти во всех случаях уступает другой структуре данных»? Связанный список медленнее для большинства операций, чем списки на основе массивов; Единственное, для чего хороши связанные списки - это удаление в постоянном времени, но в некоторых случаях это необходимо. Обратите внимание, что я не говорю о том, будет ли это хорошая структура данных для вопроса об интервью: концепции могут быть хорошим тестом, я не знаю.
Алекс тен Бринк

Ответы:

52

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

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

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


Что касается вашего редактирования:

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

Я думаю, что это хороший вопрос общего назначения, который можно использовать для оценки практически любого кандидата на программирование. Это просто должно быть частью большой группы вопросов. Это было бы хорошим ледоколом для многих типов позиций (даже если кандидат не может реализовать связанный список с нуля, возможно, они могут объяснить, как он использовал его раньше и каковы ключевые функции), или начало длинная последовательность более сложных вопросов для должности «Старший разработчик, команда Embedded Linked Lists».

Билл Ящерица
источник
19
Ваш первый абзац - половина истории. Другая половина: если заданный вопрос заставляет кандидата работать на вас, тогда это хороший вопрос для интервью. Если это делает кандидата не желающим работать на вас, это плохой вопрос.
Руах
5
Вы не можете найти предел того, что кандидат знает таким образом, потому что у вас нет возможности утверждать, что то, что вы считаете «сложным» и «базовым», применяется в том же порядке к вашему кандидату. LinkedList, вероятно, является базовым для программиста, обучаемого в университете, но программист-самоучка, скорее всего, никогда не писал его. В конце концов он, вероятно, писал «LinkedList <string> ...» всякий раз, когда ему это было нужно. Означает ли это, что его знания привязаны к уровню «связанных списков»? Он может быть экспертом по более сложным предметам и сможет изучать LL за 5 минут в Google.
Сильвердраг
1
@Sylverdrag Вот почему я сказал, что тебе нужно больше, чем один вопрос. Как только вы найдете предел своих знаний о связанных списках, перейдите к другой теме.
Билл Ящерица
@ruakh Это определенно играет роль. Если каждый вопрос, который мне задают на собеседовании, касается обыденных аспектов приложений CRUD (то есть я не думаю, что смог бы узнать что-то новое в этой компании), то меня это не заинтересует.
Билл Ящерица
34

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

Так что да, я думаю, что в лучшем случае это сомнительная практика, но я ее понимаю. Я также рассмотрел возможность того, что это не вина вопроса, а спрашивающего, из-за того, что он создает ситуацию высокого давления.

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

прецизионный самописец
источник
Им нужно что-то спросить, будь то головоломка или что-то еще. Любой вопрос может привести к пустому человеку.
Подпишите
2
@pdr - «Если они могут принести примеры кода, фантастика». Если они написали примеры кода, которые они принесли, бесценно.
Робрамбуш
4
Если у кого-то нет смысла в реализации связанного списка, и он не может проработать его с небольшими подсказками или легко разочароваться, я думаю, что это будет тот, кого я не против пропустить.
Билл К
1
@pdr - "А если ты не сможешь, как долго, ты думаешь, у тебя будет работа?" - Столько, сколько нужно, чтобы уволить их при любом режиме HR, через который вы страдаете. Тогда есть дополнительная стоимость перезапуска поиска вашего кандидата. Кроме того, альтернативные издержки связаны с тем, что следующий человек, с которым вы бы взяли интервью, мог бы стать технической опорой всего вашего отдела. Но, конечно, теперь они недоступны, потому что вы наняли не того человека, и они нашли другую работу.
Робрамбуш
1
@robrambusch: он продемонстрировал отличные навыки решения проблем и хорошо рассказал о структуре класса. Но он не писал код. Что касается написания кода в интервью, да, это может быть полезно, но я утверждаю, что могу узнать о вас больше за час разговоров с вами о проблемах, которые вы решили, чем дать вам одну надуманную проблему, которая требует час, чтобы решить.
pdr
25

Нужно определить тип задания программирования. Если вы занимаетесь разработкой компиляторов и алгоритмов, следует ожидать вопросов о таких вещах. Если вы работаете с бизнес-приложениями и ожидаете, что кандидат будет работать с CRUD-приложениями, тогда может быть достаточно знания концепции (без написания программы). Сегодня знание различных технологий, необходимых для выполнения работы специально в приложениях типа LOB, заменяет необходимость в аккуратных алгоритмах.

Без шансов
источник
В точку. В прошлом году я написал компонент генетической сортировки общего назначения, который также использовал немного имитированного отжига (для создания расписаний классов) и использовал несколько «продвинутых» структур данных, чтобы заставить его работать. Мне не нужно кодировать один. Если в .Net Framework не было того, что мне было нужно, я использовал C5 или Power Collections.
ElGringoGrande
4
Согласен, я пишу LOB-приложения весь день, у меня в прошлом были написанные реализации связанных списков ... в колледже ... в COBOL. Я мог бы сделать это снова, но почему? Многие компетентные разработчики LOB, вероятно, никогда не писали ни одного, и никогда не будут нуждаться в этом.
CaffGeek
1
Договорились в общем, но в связанном списке нет ничего экзотического, правда. Это основы, всего на один уровень выше FizzBuzz.
Франческо Де Виттори
1
@FrancescoDeVittori: Разве это иногда не проблема? Кто-то дает вам проблему для решения. Это кажется достаточно простым, но вы никогда не делали этого раньше, поэтому ваш мозг начинает биться, пытаясь найти ошибки, то, что обойдется вам в интервью, если вы не подумаете об этом. И это не там, но это отвлекает вас от решения актуальной проблемы.
фунтовые
@FrancescoDeVittori: Можете ли вы привести несколько примеров неосновных вопросов для интервью? Мне это нужно для самосовершенствования. Спасибо.
Ден
9

Мой ответ "Это зависит". Я хотел бы задать этот вопрос, если кандидат перечислил C или C ++ в своем резюме. Попытка реализовать связанный список - хороший тест для понимания указателей, который абсолютно необходим программисту на C или C ++.

С другой стороны, если кандидат не претендует на знание C или C ++, я бы не стал просить его создать связанный список, но я бы подумал задать ему вопросы. Объясните на высоком уровне, как работает связанный список. В чем сложность добавления элемента в начало списка? Хвост списка? Вставить элемент в середине списка? Когда вы будете использовать список, а не массив? Это фундаментальные концепции структуры данных, которые, IMHO, должен знать каждый программист.

Дима
источник
7

Я не считаю это плохим вопросом для интервью. Много понимания структуры данных и программирования начинается с действительно хорошего понимания связанных списков. Тем не менее, есть несколько предостережений:

1) Это типовой вопрос. Вы просто проверяете что-то очень простое: понимает ли человек связанный список. Спроси это и двигайся дальше.

2) Для связанных списков существует проблема, заключающаяся в том, что языки, которые очень подходят для демонстрации вашего понимания концепций связанных списков (например, C), могут не совпадать с языком, с которым они будут работать на работе. Конечно, вы можете продемонстрировать базовое понимание на любом языке со структурами, но попросить кандидата повторно реализовать связанный список в Erlang без использования [] - это не то же самое и не скажет вам то же самое о понимании кандидата. как просить их сделать это на C. Просить их сделать это на C, если работа связана с Java, также несколько упускает суть.

3) Имея это в виду и общие проблемы «программирования белой доски», при задании такого рода вопросов я принимаю псевдокод или диаграммы, если они демонстрируют понимание основных принципов. Я не прошу людей писать на доске код, который является синтаксически и логически совершенным, особенно если они могут потом развернуться и выявить какие-либо логические проблемы, когда их просят взглянуть на него снова. YMMV.

dclements
источник
6

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

Если бы я когда-либо брал интервью, я бы пошел на какую-то реализацию связанного списка, чтобы не проверять, насколько хорошо человек в кодировании, а чтобы проверить, какое внимание человек уделяет деталям. Любой может написать связанный список, но это граничные случаи, в которых даже некоторые хорошие программисты терпят неудачу. Не спрашивай его Write a code for linked list in C/C++. Попросите его написать общий связанный список на C (не C ++) и т. Д.

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

c0da
источник
2
Нет такой вещи, как общий связанный список в C.
DeadMG
1
Шутки в сторону? Я думал, что voidуказатели существуют только для этого ... :) Первая ссылка, которую я нашел в Google для "общего связанного списка в c", была: daniweb.com/software-development/c/threads/109260, а другая - техническая беседа. .com /… Я думал, что все это знали!
c0da
Я не проверял эти коды, но у меня есть этот тип связанного списка ранее, и он,
безусловно
Даже написание общего связанного списка в C # имеет одну или две «ошибки» (например, сравнение элементов типа T неочевидно; т. Е. (T v1, T v2) => {return v1 == v2;} не удастся скомпилировать если у вас нет ограничений класса или вы не используете оператор равенства по умолчанию)
Стивен Эверс
@ c0da На мой взгляд, список, в котором используются voidуказатели, не является общим, а просто общим для любого времени. Они могут хранить в нем любые типы вещей и даже смешивать их все, что хотят, и именно это делает его необщим для меня. Это похоже на использование базового типа objectв объектно-ориентированных языках…
тыкайте
5

За мои 10 лет профессионального программирования (и еще около десяти лет в качестве хобби) я не думаю, что мне когда-либо нужно было реализовывать связанный список. Если кто-то попросит меня сделать это во время собеседования, я могу возразить, спросив, буду ли я этим заниматься на работе.

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

Когда я брал интервью для моей текущей работы, у меня было очень мало опыта работы с технологическим стеком, используемым в компании. Теперь, спустя несколько лет, ко мне регулярно приходят коллеги, которые задают вопросы не только о продуктах, их реализации и применяемых ими стандартах, но и о гораздо более общих проблемах программирования (только вчера меня спросили, что последствия имели циклическую зависимость в ограничении по умолчанию в SQL Server в контексте конкретной таблицы и ее использование в нашем случае - исходя из этого, оказалось, что в этом конкретном случае не было никаких последствий). Для этого мне также не понадобилась новая реализация связанного списка.

Задайте вопросы, которые имеют отношение к работе, которую кандидат, вероятно, будет назначени попытаться понять, что они думают о приобретении новых знаний. Как они могли бы выяснить значение какого-то неясного синтаксиса, который они никогда не видели? (Если вы, например, магазин C, тогда вы можете попробовать задать вопрос, связанный с триграфами.) Для программистской позиции они регулярно читают или участвуют в форумах, таких как переполнение стека? Если бы их попросили выполнить какую-то задачу на языке программирования или в среде, с которой у них мало опыта или вообще нет опыта (скажем, если вы, прежде всего, магазин Java, а как насчет Clojure или .NET?), То как бы они подошли к этой проблеме? Возможно, возьмите реальную ошибку из вашего баг-трекера (может быть, даже ту, которая уже давно устранена) и спросите их, как они в общих чертах подойдут к ее решению, и будьте готовы объяснить соответствующие части рассматриваемого продукта.

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

CVn
источник
4

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

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

Бенджамин Банье
источник
4

Вы начинаете говорить, что это вопросы «дай мне», но затем вы указываете, что люди по понятным причинам не смогут их выполнить. Я запутался.

Вот как я об этом думаю:

  • Как вы говорите, редко нужно писать, чтобы люди легко забыли.
  • Их не невероятно сложно написать.
  • Понятия, используемые для их написания, можно считать фундаментальными.
  • Они используются невероятно часто (даже если вы не знаете об этом).

Я думаю, что это заставляет их задавать хорошие вопросы. Если вы беспокоитесь о том, что они предварительно готовятся к собеседованию, то добавьте список. Пусть они напишут циркуляр и спросят, каково асимптотическое время выполнения их реализации. Или они пишут другую общую и / или быструю структуру данных ... Бинарное дерево поиска? Очередь (FIFO)? Стек (ФИЛО)? Наивная ( O(n)) очередь с приоритетами? Многие люди, которых я знаю, думают, что BST - это O(log n) только потому, что это дерево .

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

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

Стивен Эверс
источник
Это не смущает на практике. FizzBuzz - еще более легкий вопрос, но заявители обычно даже не могут начать на него отвечать. То же самое касается связанных списков. Это загадка мира программирования.
joshin4colours
@ joshin4colours: Нет, я запутался в этом вопросе. Сначала OP говорит, что вопросы LL - это вопрос, но затем переходит к списку пунктов о том, почему квалифицированный разработчик не сможет ответить на этот вопрос.
Стивен Эверс
3

Достаточно ли полезен этот вопрос, чтобы его можно было широко использовать для оценки кандидатов на программирование по всем направлениям?

Нет, абсолютно нет. В зависимости от того, как это сформулировано, то, что он скажет вам, будет варьироваться от «этот кандидат знает, как создать связанный список» до «этот кандидат может запрограммировать связанный список на языке X». Если вы попросите псевдокод, он будет больше склоняться к первому. Если вы попросите реализацию на определенном языке, вы получите больше информации об их понимании языка (особенно с C и C ++, где вы можете иметь дело с указателями, ссылками и структурами).

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

Если человек собирается писать код, я бы подумал о включении вопроса об алгоритме и / или структуре данных, если он имеет отношение к позиции. Я бы попробовал выбрать то, что могло быть обсуждено или использовано раньше. Я бы также сосредоточился на других вещах, а не только на реализации указанных алгоритмов и структур данных, таких как время выполнения и потребление памяти (такие вещи, как нотация big-O). Эти концепции имеют отношение не только к созданию структуры данных, но также и к выбору, какая реализация лучше всего подходит (например, ArrayListпротив a LinkedList).

Томас Оуэнс
источник
3

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

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

H27studio
источник
2

Я думаю, что это плохой пример вопроса для интервью, но по другой причине. Связанный список - это настолько простая концепция, что знать, что это такое, значит знать, как его реализовать. Если человек не знает, что такое связанный список, вы должны объяснить, как он работает, и при этом вы даете ответ, не выясняя ничего о том, знают ли они, как решать проблемы . Таким образом, вопрос сводится к «вы уже знаете, что такое связанный список и как он работает?», Что не говорит вам ничего полезного об их пригодности в качестве программиста.

Мейсон Уилер
источник
2
Популярные вопросы также являются предметом игр для людей, которые хорошо запоминают.
Пол Натан
1
Если вам нужно объяснить, как связанный список работает с кандидатом, вы, вероятно, не должны нанимать его для программирования ...
Дима
2

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

  • Он знает, что такое API? Может ли он использовать чужой код? Может ли он написать код, чтобы другие могли его использовать?

  • Знает ли он, что такое связанный список? Знает ли он Коллекции, Структуры Данных, Алгоритмы?

Если он даже не знает, какие методы должен предложить Связанный список, вы знаете, что он, вероятно, никогда не использовал его, или знает, когда его использовать.

  • Как он справляется с проблемой? Начинает ли он сначала с анализа, с небольшой спецификации, перед тестами? Или он просто начинает счастливо взламывать?

  • Он обрабатывает крайние случаи? Как насчет удаления последнего узла из связанного списка? Что если кто-то попытается добавить ссылку на сам связанный список в связанный список, а затем удалит все это?

  • Он обрабатывает исключения? Каждый язык программирования имеет свои собственные соглашения для обработки исключений: в Java вы ожидаете, что LinkedList сгенерирует исключение NoSuchElementException, когда вы выполняете getFirst () в пустом списке. Другие языки могут возвращать undefined, -1 или константу.

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