Читая этот сайт и ТАК, я видел много историй вопросов и ответов на собеседования, в которых говорилось, что кандидат должен был создать связанный список с нуля. Обычно это упражнение «дай мне» для кандидатов на роль в программировании, таких как написание FizzBuzz. Идея состоит в том, что если кандидат не может этого сделать, он не может программировать и должен быть отклонен почти сразу.
Тем не менее, я не могу не думать, что это может быть плохой практикой по следующим причинам:
- Современные языки высокого уровня, такие как C # и Python, широко используют списки; написание собственного объекта связанного списка потребовалось бы только при необычных обстоятельствах и даже тогда, вероятно, опрометчиво.
- Языки более низкого уровня, такие как C ++, имеют стандартные библиотеки с контейнерами итераторов / списков и объектами.
- В свете первых двух пунктов кодеры могут идти годами, даже не задумываясь о реализации списка (связанного, двусвязного и т. Д.). Некоторые могут даже не видеть такие вещи со времен колледжа.
- Вычислительная мощность также не является фактором, который был несколько лет назад, поэтому эффективность с помощью указателей не является проблемой, которой она была (в целом).
- Простой веб-поиск чего-то вроде «связанного списка» привел бы к множеству примеров кода, которые можно было бы просто запомнить и выплюнуть, не указывая на истинную компетенцию кандидата.
Я должен сказать, что использование связанного списка, чтобы вести открытые вопросы / обсуждения проблем кандидатов / способности критического мышления, - это, скорее всего, действительно хорошая практика интервью. В любом случае, интервьюер действительно может увидеть, на что похож заявитель и как он думает, что это очень полезно.
Я думаю, что этот двоичный подход «нет кода связанного списка, нет работы» для программистов, работающих над настольным компьютером или веб-приложением, несколько устарел. Это также может быть довольно вредно; кандидат, который не может вспомнить, как правильно работать с главой списка, может быть отличным программистом и коллегой и потеряться в миксе. Мысли?
РЕДАКТИРОВАТЬ : Есть много (хороших) комментариев, предполагающих, что это хороший или плохой вопрос, зависит от контекста работы. Я полностью согласен, поэтому позвольте мне перефразировать этот вопрос: реализация связанного списка - это распространенный вопрос интервью для широкого круга заданий по кодированию, аналогичный таким вопросам, как FizzBuzz или написание рекурсивной функции для вычисления факториалов. Достаточно ли полезен этот вопрос, чтобы его можно было широко использовать для оценки кандидатов на программирование по всем направлениям? Или следует считать плохим вопрос, за исключением должностей «Старший разработчик, команда встроенных связанных списков»?
источник
Ответы:
Если ответ на вопрос говорит вам, что вы хотите знать о кандидате, тогда это хороший вопрос для интервью. Если это не говорит вам, это плохой вопрос.
Простые вопросы, такие как FizzBuzz, служат определенной цели. Если кандидат не может кодировать FizzBuzz, он просто не может кодировать, и вы можете закончить интервью раньше. Я бы оценил реализацию связанного списка лишь немного сложнее, но он может начать разговор о структурах данных в целом, что многое покажет.
Просто помните, что ни один вопрос интервью не скажет вам всего, что вы хотите знать. Вам действительно нужно подготовить группу вопросов. Вы должны задавать вопросы в последовательности от самых простых до самых сложных, чтобы вы могли найти предел того, что знает кандидат. Если вы зададите один вопрос, и они его приколят, вы все равно не знаете, что еще они делают или не знают.
Что касается вашего редактирования:
Я думаю, что это хороший вопрос общего назначения, который можно использовать для оценки практически любого кандидата на программирование. Это просто должно быть частью большой группы вопросов. Это было бы хорошим ледоколом для многих типов позиций (даже если кандидат не может реализовать связанный список с нуля, возможно, они могут объяснить, как он использовал его раньше и каковы ключевые функции), или начало длинная последовательность более сложных вопросов для должности «Старший разработчик, команда Embedded Linked Lists».
источник
Я упустил работу только потому, что у меня не было таких простых головоломок. Я также блестяще справлялся с такими загадками в других интервью - я знаю, как реализовать связанный список в среде без давления. У меня никогда не было жалоб на мои способности от кого-то, с кем я работал, поэтому, возможно, я не должен думать, что я упустил работу, я должен думать, что они упустили меня.
Так что да, я думаю, что в лучшем случае это сомнительная практика, но я ее понимаю. Я также рассмотрел возможность того, что это не вина вопроса, а спрашивающего, из-за того, что он создает ситуацию высокого давления.
Лично я предпочитаю задавать открытые вопросы о проблеме, которую кандидат уже решил - недавно, если это возможно, и затрагивает проблемы как кодирования, так и процесса. Если они могут принести примеры кода, фантастика.
источник
Нужно определить тип задания программирования. Если вы занимаетесь разработкой компиляторов и алгоритмов, следует ожидать вопросов о таких вещах. Если вы работаете с бизнес-приложениями и ожидаете, что кандидат будет работать с CRUD-приложениями, тогда может быть достаточно знания концепции (без написания программы). Сегодня знание различных технологий, необходимых для выполнения работы специально в приложениях типа LOB, заменяет необходимость в аккуратных алгоритмах.
источник
Мой ответ "Это зависит". Я хотел бы задать этот вопрос, если кандидат перечислил C или C ++ в своем резюме. Попытка реализовать связанный список - хороший тест для понимания указателей, который абсолютно необходим программисту на C или C ++.
С другой стороны, если кандидат не претендует на знание C или C ++, я бы не стал просить его создать связанный список, но я бы подумал задать ему вопросы. Объясните на высоком уровне, как работает связанный список. В чем сложность добавления элемента в начало списка? Хвост списка? Вставить элемент в середине списка? Когда вы будете использовать список, а не массив? Это фундаментальные концепции структуры данных, которые, IMHO, должен знать каждый программист.
источник
Я не считаю это плохим вопросом для интервью. Много понимания структуры данных и программирования начинается с действительно хорошего понимания связанных списков. Тем не менее, есть несколько предостережений:
1) Это типовой вопрос. Вы просто проверяете что-то очень простое: понимает ли человек связанный список. Спроси это и двигайся дальше.
2) Для связанных списков существует проблема, заключающаяся в том, что языки, которые очень подходят для демонстрации вашего понимания концепций связанных списков (например, C), могут не совпадать с языком, с которым они будут работать на работе. Конечно, вы можете продемонстрировать базовое понимание на любом языке со структурами, но попросить кандидата повторно реализовать связанный список в Erlang без использования [] - это не то же самое и не скажет вам то же самое о понимании кандидата. как просить их сделать это на C. Просить их сделать это на C, если работа связана с Java, также несколько упускает суть.
3) Имея это в виду и общие проблемы «программирования белой доски», при задании такого рода вопросов я принимаю псевдокод или диаграммы, если они демонстрируют понимание основных принципов. Я не прошу людей писать на доске код, который является синтаксически и логически совершенным, особенно если они могут потом развернуться и выявить какие-либо логические проблемы, когда их просят взглянуть на него снова. YMMV.
источник
Когда я давал интервью, меня часто спрашивали о реализации связанных списков и некоторых алгоритмах, сосредоточенных вокруг связанных списков. Я решил большинство из них, и некоторые из них требовали, чтобы я немного тренировал свои нейроны.
Если бы я когда-либо брал интервью, я бы пошел на какую-то реализацию связанного списка, чтобы не проверять, насколько хорошо человек в кодировании, а чтобы проверить, какое внимание человек уделяет деталям. Любой может написать связанный список, но это граничные случаи, в которых даже некоторые хорошие программисты терпят неудачу. Не спрашивай его
Write a code for linked list in C/C++
. Попросите его написать общий связанный список на C (не C ++) и т. Д.Переверните проблему и добавьте некоторые другие условия в связанный список, и у вас будет хороший вопрос. Некоторые люди обязаны совершать ошибки тогда.
источник
void
указатели существуют только для этого ... :) Первая ссылка, которую я нашел в Google для "общего связанного списка в c", была: daniweb.com/software-development/c/threads/109260, а другая - техническая беседа. .com /… Я думал, что все это знали!void
указатели, не является общим, а просто общим для любого времени. Они могут хранить в нем любые типы вещей и даже смешивать их все, что хотят, и именно это делает его необщим для меня. Это похоже на использование базового типаobject
в объектно-ориентированных языках…За мои 10 лет профессионального программирования (и еще около десяти лет в качестве хобби) я не думаю, что мне когда-либо нужно было реализовывать связанный список. Если кто-то попросит меня сделать это во время собеседования, я могу возразить, спросив, буду ли я этим заниматься на работе.
Конечно, там почти наверняка есть рабочие места там , где вам будет необходимо написать реализации более или менее чистые помещения из широко известных алгоритмов - как реализовать связанный список с нуля. Но для большинства заданий по программированию, какое значение имеет для компании то, что кандидат может сделать это во время собеседования? Неужели так важно в такой ситуации, что кандидат обеспечивает идеальную реализацию, которая правильно обрабатывает крайние случаи, сообщает о сбоях в соответствии с обычной практикой в языке или структуре и т. Д.? Или вы можете игнорировать это и вместо этого сосредоточиться на том, как они на самом деле подходят к проблеме, с которой они, возможно, не сталкивались в течение 10-20 лет?
Когда я брал интервью для моей текущей работы, у меня было очень мало опыта работы с технологическим стеком, используемым в компании. Теперь, спустя несколько лет, ко мне регулярно приходят коллеги, которые задают вопросы не только о продуктах, их реализации и применяемых ими стандартах, но и о гораздо более общих проблемах программирования (только вчера меня спросили, что последствия имели циклическую зависимость в ограничении по умолчанию в SQL Server в контексте конкретной таблицы и ее использование в нашем случае - исходя из этого, оказалось, что в этом конкретном случае не было никаких последствий). Для этого мне также не понадобилась новая реализация связанного списка.
Задайте вопросы, которые имеют отношение к работе, которую кандидат, вероятно, будет назначени попытаться понять, что они думают о приобретении новых знаний. Как они могли бы выяснить значение какого-то неясного синтаксиса, который они никогда не видели? (Если вы, например, магазин C, тогда вы можете попробовать задать вопрос, связанный с триграфами.) Для программистской позиции они регулярно читают или участвуют в форумах, таких как переполнение стека? Если бы их попросили выполнить какую-то задачу на языке программирования или в среде, с которой у них мало опыта или вообще нет опыта (скажем, если вы, прежде всего, магазин Java, а как насчет Clojure или .NET?), То как бы они подошли к этой проблеме? Возможно, возьмите реальную ошибку из вашего баг-трекера (может быть, даже ту, которая уже давно устранена) и спросите их, как они в общих чертах подойдут к ее решению, и будьте готовы объяснить соответствующие части рассматриваемого продукта.
Если кандидат может решать проблемы, связанные с бизнес-кейсами, и имеет хорошее отношение к изучению новых вещей, это, вероятно, гораздо лучший показатель соответствия этой конкретной должности, чем способность давать постоянные ответы на общеизвестные вопросы, будь то вопросы касаются FizzBuzz, связанных списков или чего-то еще. Добавьте, насколько хорошо кандидат подходит к команде, и я думаю, что вы находитесь на довольно безопасной почве.
источник
Конечно, большинству людей никогда не потребуется реализовывать связанный список, но для их реализации с нуля, вероятно, потребуется правильно обрабатывать указатели. Тогда они считают, что формирование последовательной ментальной модели для указателей коррелирует с владением языком, пониманием того, что происходит на некотором (абстрактном) машинном уровне, и способностью абстрагироваться в целом.
Я не говорю, что это обязательно будет наилучшей мерой, но только в том, что есть некоторая корреляция.
источник
Вы начинаете говорить, что это вопросы «дай мне», но затем вы указываете, что люди по понятным причинам не смогут их выполнить. Я запутался.
Вот как я об этом думаю:
Я думаю, что это заставляет их задавать хорошие вопросы. Если вы беспокоитесь о том, что они предварительно готовятся к собеседованию, то добавьте список. Пусть они напишут циркуляр и спросят, каково асимптотическое время выполнения их реализации. Или они пишут другую общую и / или быструю структуру данных ... Бинарное дерево поиска? Очередь (FIFO)? Стек (ФИЛО)? Наивная (
O(n)
) очередь с приоритетами? Многие люди, которых я знаю, думают, что BST - этоO(log n)
только потому, что это дерево .Если вы ищете кого - то , кто будет работать на металле, и нуждается в очень прочную основу в структурах данных ... это может быть даже далеко слишком тривиальным для кандидатов вы хотите нанять.
Это, конечно, предполагает, что вам нужен разработчик, который имеет основы / основы структур данных, и их позиция выиграет от этих основ. Если вы хотите кого-то, кто может за несколько секунд собрать страницу с asp, собеседование для этого. Суть не в том, чтобы выбрать вопрос для интервью, как все остальные, а в том, чтобы определить, какие навыки вы ищете. Лично я думаю, что вопросы структуры данных - это хорошо, связан ли список или нет.
источник
Нет, абсолютно нет. В зависимости от того, как это сформулировано, то, что он скажет вам, будет варьироваться от «этот кандидат знает, как создать связанный список» до «этот кандидат может запрограммировать связанный список на языке X». Если вы попросите псевдокод, он будет больше склоняться к первому. Если вы попросите реализацию на определенном языке, вы получите больше информации об их понимании языка (особенно с C и C ++, где вы можете иметь дело с указателями, ссылками и структурами).
Я бы даже сказал, что невозможно оценить всех кандидатов, используя одни и те же вопросы. Вы должны адаптировать свои вопросы интервью, чтобы оценить навыки, которые вы ищете в этой должности.
Если человек собирается писать код, я бы подумал о включении вопроса об алгоритме и / или структуре данных, если он имеет отношение к позиции. Я бы попробовал выбрать то, что могло быть обсуждено или использовано раньше. Я бы также сосредоточился на других вещах, а не только на реализации указанных алгоритмов и структур данных, таких как время выполнения и потребление памяти (такие вещи, как нотация big-O). Эти концепции имеют отношение не только к созданию структуры данных, но также и к выбору, какая реализация лучше всего подходит (например,
ArrayList
против aLinkedList
).источник
Я не думаю, что для обычной работы программиста должен быть вопрос, который устраняет кандидата. Но это хорошо, чтобы увидеть, имеете ли вы дело с действительно старшим программистом или с кем-то, кто много лет занимался программированием обезьян. И даже в этом случае это не должно быть фундаментальным критерием выбора программиста. Может быть, отличный программист с плохой памятью и не читал слова «связанный список» по годам (или не помнит название), но все же может делать хорошие приложения.
Итак, как некоторые говорили, если это будет работа, которая должна работать со связанным списком и множеством причудливых алгоритмов и т. Д., Тогда хорошо. Если для обычных входных данных в форме, проверить и показать это бесполезно и несправедливо.
источник
Я думаю, что это плохой пример вопроса для интервью, но по другой причине. Связанный список - это настолько простая концепция, что знать, что это такое, значит знать, как его реализовать. Если человек не знает, что такое связанный список, вы должны объяснить, как он работает, и при этом вы даете ответ, не выясняя ничего о том, знают ли они, как решать проблемы . Таким образом, вопрос сводится к «вы уже знаете, что такое связанный список и как он работает?», Что не говорит вам ничего полезного об их пригодности в качестве программиста.
источник
Написание реализации связанного списка - хороший вопрос для собеседования, потому что он многое расскажет о способе кодирования кандидата:
Он знает, что такое API? Может ли он использовать чужой код? Может ли он написать код, чтобы другие могли его использовать?
Знает ли он, что такое связанный список? Знает ли он Коллекции, Структуры Данных, Алгоритмы?
Если он даже не знает, какие методы должен предложить Связанный список, вы знаете, что он, вероятно, никогда не использовал его, или знает, когда его использовать.
Как он справляется с проблемой? Начинает ли он сначала с анализа, с небольшой спецификации, перед тестами? Или он просто начинает счастливо взламывать?
Он обрабатывает крайние случаи? Как насчет удаления последнего узла из связанного списка? Что если кто-то попытается добавить ссылку на сам связанный список в связанный список, а затем удалит все это?
Он обрабатывает исключения? Каждый язык программирования имеет свои собственные соглашения для обработки исключений: в Java вы ожидаете, что LinkedList сгенерирует исключение NoSuchElementException, когда вы выполняете getFirst () в пустом списке. Другие языки могут возвращать undefined, -1 или константу.
источник