Как гласит заголовок, какая ваша любимая проблема с собеседованием на доске и почему она оказалась для вас эффективной?
Младший, старший, Java, C, Javascript, PHP, SQL, псевдокод и т. Д.
Как гласит заголовок, какая ваша любимая проблема с собеседованием на доске и почему она оказалась для вас эффективной?
Младший, старший, Java, C, Javascript, PHP, SQL, псевдокод и т. Д.
Ответы:
Я прошу кандидата разработать решение проблемы, с которой я действительно столкнулся в своей повседневной работе. Поступая так, я пытаюсь создать диалог между мной и кандидатом. Я пытаюсь обсудить дизайн, который он строит, как будто я никогда не думал о проблеме раньше.
Я пытаюсь оценить, можем ли мы понять друг друга и можем ли мы говорить о технической проблеме без путаницы.
(Для рабочего стола Java разработчик)
Разработайте API для обработки истории навигации веб-браузера (предыдущая страница, следующая страница, перечислите 10 предыдущих страниц), и это может быть многократно использовано во многих частях приложения (здесь я привожу конкретные примеры в нашем приложении). Затем набросайте реализацию.
Мне нравится этот, потому что он достаточно прост, его легко проиллюстрировать, его можно решить шаг за шагом (добавить дополнительное поведение, не нарушая все), он позволяет говорить о крайних случаях и обработке ошибок, а также позволяет говорить о данных структур.
Я нашел это чрезвычайно интересным, когда брал интервью у кандидатов и отсеивал тех, у кого там не было бизнеса. По сложности он похож на Fizz Buzz, но фокусируется на навыках работы с базами данных.
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
Я позволил им написать это в любом варианте SQL, который они хотят, и не слишком требователен к незначительным синтаксическим проблемам. В основном я хочу знать, что они понимают основные понятия реляционных БД.
Большинство кандидатов могут пройти часть 3 без каких-либо проблем. Вы будете удивлены, как многие думают, что ответ на часть 4 состоит в том, чтобы просто изменить оператор с ИЛИ на И в предложении где.
«Нарисуй для меня на доске дизайн последнего проекта, над которым ты работал, не раскрывая мне никаких чувствительных деталей».
Реализовать strcpy
, strcmp
и друзья.
atoi()
.
strdup()
.
strrev()
или перевернуть строку. Мое решение для белой доски произвело на них впечатление, и сейчас я делаю работу.
Мой фаворит, который охватывает несколько дисциплин, состоит в том, чтобы подсчитать количество узлов в двоичном дереве с учетом интерфейса (в C #):
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
и просто для удовольствия, вот реализация, хотя интервьюируемый не должен видеть это.
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
и помощник класса:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
Решение, которое мне нравится видеть, состоит в следующем:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
Как это демонстрирует знание:
Два вопроса, которые вызвали для меня интересные дискуссии на доске:
Они начинаются с простого, а затем становятся все более сложными.
Я не люблю использовать головоломку или вопрос дизайна в качестве вопроса доски. Я предпочитаю простые, простые вопросы, которые проверяют способность кандидата написать некоторый код. Мои любимые:
1) Напишите функцию, чтобы перевернуть односвязный список. (Требуется некоторое время, прежде чем они поймут, что им нужно 3 указателя.)
2) Для заданного двоичного дерева найдите глубину двоичного дерева. (Этот вопрос проверяет их способность писать рекурсивный код. Позвольте мне проверить, не поврежден ли их базовый случай.)
3) Напишите процедуру для двоичного поиска в массиве целых чисел. (Как говорит Джон Бентли (в Programming Pearls), многие люди, как правило, допускают ошибки при написании бинарного поиска. Затем можно найти ошибки, написать контрольные примеры, выполнить код и т. Д.)
Мы использовали это в одной компании, в которой я работал.
Мы передали кандидату лист бумаги, используемый для отслеживания времени. Это было реальное расписание, используемое одним или нашими подразделениями. Мы попросили кандидата провести нас через процесс проектирования для создания лучшего инструмента отслеживания времени. Никаких границ, не говорил, на каком языке и т. Д., Просто хочу посмотреть, насколько хорош кандидат на «полном жизненном цикле». Это дало нам реальное представление о том, как они собирали требования. Как они структурировали таблицы базы данных, какой интерфейс они могли бы делать. Навыки общения, очевидно, были необходимы для этой задачи. Обычно это делалось в комнате с несколькими большими белыми досками и длилось до 2 часов.
Мы наняли несколько человек, использующих этот процесс, и если они действительно хорошо справились с поставленной задачей, они очень хорошо для нас. Если они были маргинальными, и мы все равно решили их нанять (отдельная тема), то они были маргинальными программистами.
Я использую проблему, которая имеет отношение к моей области программирования.
Если я разрабатываю веб-приложения, я хочу посмотреть, как они могут составить веб-форму, которая удаляет записи, и какой подход они могут использовать, например, для удаления записи из базы данных. Это говорит мне, знают ли они базовые принципы базы данных, как они взаимодействуют с пользователем для проверки удаления, и знают ли они, что такое мягкое удаление.
У меня нет любимой. Задача, которую я выберу, сильно зависит от работы.
Мне все равно, смогут ли они решить проблему полностью или нет в ходе собеседования, какие технологии и языки они используют, или насколько дрянно выглядит их код на доске. Я ищу образец мысли; Я хочу посмотреть, знают ли они, как продумывать и решать проблемы.
Моим любимым был мой друг.
Напишите мне функцию для генерации / печати / хранения первых «n» простых чисел, а затем объясните, как это работает и насколько эффективно.
Это работает хорошо, потому что:
Это алгоритмический вопрос, поэтому требуется, чтобы собеседник уметь думать, а затем объяснять свое мышление, чтобы вы могли видеть, как работает его мозг.
Это не зависит от языка.
Вряд ли кто-то понимает это правильно (обычно это крайний случай, который они пропускают (обычно 1 или 2)), или они не обрабатывают отрицательные числа, поэтому вы можете увидеть, как они обрабатывают ошибки, и им говорят, что они ошибаются.
Большинство делают это как простое, но очень медленное сито (например, 80% людей проверят n как простое число, разделив n на все целые числа меньше n), что дает вам много возможностей для разговоров о том, как они могли бы улучшить алгоритм на основе о пространственно-временных компромиссах, например, «почему вы делите число на 4, если вы уже знаете, что оно не делится на 2?» или «Вы выяснили, что вам нужно только делить на все простые числа меньше, чем sqrt (n), но для этого требуется, чтобы вы где-то хранили эти числа, каковы последствия этого?»)
Там нет необходимости для них, чтобы получить правильный ответ. Если кто-то может подумать и объяснить свое мышление, то ему предстоит долгий путь, чтобы стать хорошим кандидатом.
Что-то под названием aff_z, которое было частью экзаменов C моей инженерной школы и использовалось в качестве «фиктивного» теста, чтобы ученики не смогли при возвращении из отпуска (наша система маркировки подразумевала, что провал теста остановил маркировку, поэтому провал этого фиктивного теста лишить законной силы весь ваш тест. Заставляет вас обратить внимание на идиотские детали). Я использовал его один или два раза во время интервью.
В любом случае ... Я забыл точную формулировку, но это было что-то вроде этого ...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
Грустная вещь состоит в том, что не только некоторые студенты придумают чрезвычайно запутанные решения, когда ответ достаточно очевиден, но что некоторым даже удастся потерпеть неудачу.
И, верьте или нет, это происходило и во время интервью.
Запускать это на собеседованиях было довольно весело, так как некоторые заявители начинали писать возможные ветки и потом понимали, что не так (очевидно, если вы спрашиваете их только устно, вполне понятно, что они делают это так, как вы говорите ... но если вы дать в письменном виде, я нахожу это озадачивающим ...)
Это глупо, но я предполагаю, что это минималистичный скрининг (аналогично, когда я нанимаю программистов на JS, я всегда спрашиваю, как объявить переменную, а затем, в зависимости от их ответа, имеет ли вообще какое-либо значение использование var. Довольно часто печальный момент, честно говоря.)
variablename = variablevalue;
», тогда как хорошие просто смеялись по телефону или лично и прямо говорили мне, что будет с другим или без него. var
).
Это действительно зависит от того, что вы ищете. Как организация, которая выполняет большую динамическую работу в сети с изображениями, я склонен задавать вопрос о геометрии, относящийся к работе. В любом случае, я склонен задавать геометрический вопрос, так как считаю это хорошим тестом по математике, который приятен и нагляден и может показать кандидатам способность визуально представить свою работу и методично проработать задачу.
Для продвинутых кандидатов я иногда задаю следующий вопрос:
Это изображение показывает полумесяц. Ширина полумесяца от B до D составляет 9 см, а между E и F - 5 см. С является центром большего круга.
а) Пожалуйста, рассчитайте площадь полумесяца.
б) Опишите вычисления, необходимые для изменения размера изображения, чтобы оно соответствовало внутреннему кругу любого заданного размера, и поместите его в круг, если известна центральная точка.
Для более простого вопроса я обычно задаю такой же вопрос, но использую пример «квадрат в круге в квадрат». Хотя это очень легко, так что я бы ожидал идеальной алгебры.
Помимо этого, я склоняюсь к тому, чтобы они разработали алгоритм для генерации всех комбинаций набора данных переменной длины.
Лучшие ответы FizzBuzz, которые я видел:
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C # (простой)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C # (умный)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
Я ищу пару вещей у кандидатов, у которых я брал интервью. По причине, которую я не могу описать в Интернете, у нас довольно плохие кандидаты, и я ожидал этого, поэтому я довольно легко с ними справляюсь. Даже до сих пор я ищу:
Осведомленность о дизайне.
«Покажите мне структуру таблицы для программы адресной книги, в которой есть Контакты с именами и фамилиями, которые могут иметь несколько телефонных номеров с описанием номера (ячейка / дом / работа / и т. Д.)»
Я не ищу здесь диаграмму спецификации UML 2.0, простая пузырьковая диаграмма здесь подойдет. Пока это разумно.
Знание работы с базой данных (т.е. SQL)
Знание тестирования
Предположим, существует метод с сигнатурой, public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
который возвращает результаты вашего запроса ранее. Предположим, что если вы передадите null в метод, он выдаст исключение NullReferenceException. Напишите тест, чтобы продемонстрировать эту функциональность.
Напишите тест, который продемонстрирует, что GetPhoneNumbers вернет номер домашнего телефона (123) 456-7890 для человека с фамилией «кузнец».
Знание того, как написать код
Реализуйте метод, который будет соответствовать требованиям тестов, которые вы написали.
Учитывая количество и качество заявителей, которых мы получили, я опросил всех, кто когда-либо серьезно обращался. Я никого не нанял.
Я обычно позволяю им набросать блок-схему последней системы, над которой они работали, спрашивая об отношениях между блоками, и затем позволяю им уточнить блок, над которым они работали / отвечали. Из этого упражнения вы можете многому научиться, например, как человек смотрит за пределы своей маленькой области, насколько ему важно знать «где» он действует, также вы можете узнать о роли, которую он играл, был ли это ключ или сторона роль.
Напишите алгоритм для следующей задачи: Учитывая число n , выведите общее количество (уникальных) двоичных деревьев, которые имеют n узлов.
Таким образом, для n = 0 и n = 1 ответ равен 1. Для n = 2 у вас есть 2: корневой узел, а затем второй узел либо слева, либо справа.
Вы можете получить представление о методах проектирования и посмотреть, думают ли они о рекурсии или запоминании или о решении для динамического программирования.
См. Также это обсуждение StackOverflow для связанного, но другого случая деревьев бинарного поиска.]
Если бы я взял интервью у разработчика программного обеспечения, я бы попросил его спроектировать программное обеспечение и описать требования к оборудованию, чтобы удалить дублирующиеся записи из произвольно большого файла, содержащего полное имя в каждой строке. Я намеренно оставляю некоторые части описания проблемы двусмысленными. Затем я призываю его понять, понимает ли он анализ и уточнение требований, различных компромиссов, структур данных и алгоритмов, операций ввода-вывода (вторичного хранения), программных и аппаратных технологий, масштабируемости и т. Д.
Я думаю, что это небольшая, но сложная проблема, раскрывающая знания и способности заявителя во многих вычислительных областях.
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Многие ребята могли застрять на этом. Если дано какое-то решение - обычно оно использует рекурсию. После того:
Implement the same via 'for'-loop
Не могу сказать, сколько ребят не справились с обеими задачами - 50% кандидатов.
Вот почему мне это нравится :)
fib(n)=round(power(PHI,n)/SQRT5)
. PHI и SQRT5 - это константы, представляющие золотое сечение (1,618 ...) и квадратный корень из 5 соответственно.
Для баз данных я иду с:
Таблица: вещи Имя ID 1 Бодкин Ван Хорн 2 Hoos-Foos 3 Ху-Фу 4 Hot-Shot 5 Marvin O'Gravel Воздушный шар для лица 6 Снимм 7 Marvin O'Gravel Воздушный шар для лица 8 Марвин О'Гравел Лицо из Воздушных Шаров 9 Дейв
Напишите мне какой-нибудь SQL-код, который будет дублировать такую таблицу на основе имени (и мне все равно, какой идентификатор я получу, но какой бы ни был возвращен, он должен быть действительным для этого имени). Таким образом, таблица, когда к ней применен правильный SQL, будет выглядеть примерно так:
Таблица: вещи Имя ID 1 Бодкин Ван Хорн 2 Hoos-Foos 4 Hot-Shot 5 Marvin O'Gravel Воздушный шар для лица 6 Снимм 9 Дейв
Я люблю его, потому что:
(Вот где я обнаружил, что есть какой-то совершенно тривиальный способ сделать это, и я все это время слишком усложнял).
SELECT min(ID), Name FROM Things GROUP BY Name
бы сработало, верно?
HAVING count(Name) > 1
, но тогда, я думаю, ваш пример ответа не должен включать Бодкина Ван Хорна, Hot Shot, Snimm и Dave.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. У вас есть предпочтительное решение?
Моя любимая проблема с C ++ на доске - заставить кандидата реализовать
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
Из этого я могу научиться
Как бы вы представляли стандартную колоду из 52 карт? Любой язык программирования в порядке. Как бы вы перемешали карты?
Мой любимый - начать с запроса прототипа printf. Затем, учитывая низкоуровневый API printc (char c), который будет печатать один символ, реализуем printf. Дает всевозможные интересные ответы, такие как стек является частью процессора. Как вы уже догадались, я из C и встроенного фона.
varargs()
или какую-то функцию, подобную этой. Я прав? Я сделал это только один раз, чтобы сказать, что сделал это некоторое время назад.
У вас есть миска с 200 рыбами. 99% этих рыб не являются гуппи. Сколько рыбы вы должны удалить, чтобы 2% того, что осталось, было гуппи. Показать свою работу.
Это о запутанных требованиях. Сказано так, чтобы несколько раз менять перспективы в течение одного и того же вопроса. Это предназначено, чтобы видеть, могут ли они выяснить, что действительно происходит.
Вы будете удивлены, как много людей ошибаются.
answer = 100
. [Предполагая, что вы можете выборочно выбрать другую рыбу. Если удалить гуппи, есть и другие ответы.] Хороший вопрос, вы будете удивлены, как мало людей справляются с этим, хотя для программиста это должно быть детской забавой.
У меня есть несколько фаворитов, но вот пара, которая почти всегда появляется. Большую часть времени я даю итоговые технические (C ++) интервью, поэтому предпочитаю более длинные и открытые вопросы, которые приводят к новым интересам. Там нет «правильный» ответ, просто открытие для другого разговора.
1) Реализация базового общего указателя, объяснения того, где есть недостатки по сравнению с tr1 или общими указателями boost в их реализации, как его следует использовать и т. Д.
2) Обзор кода. Для опытных сотрудников мы ожидаем, что они смогут уверенно просмотреть предоставленный код на наличие проблем проектирования, ошибок, ошибок кодирования и потенциальных проблем с ремонтопригодностью. Также, конечно, как они это исправят; и иногда, как они передают это сообщение младшему разработчику, которого они сбивают.
Один вопрос, который я использовал с тех пор, как он был использован для меня, заключается в следующем:
Напишите функцию для печати всех чисел от 1 до 100.
Большая часть причины, по которой я его использовал, заключается в том, что вы можете принять решение и двигаться в разных направлениях:
Как бы вы изменили функцию для печати всех чисел от 1 до 1000, 10000 или n ?
Их ответы на эти вопросы могут дать вам представление о том, как они реагируют на изменяющиеся требования, а также могут ли они учитывать соображения производительности. Сильный кандидат может ответить вопросом о том, какая функция нужна для того, как часто она будет вызываться.
Двигаемся в другом направлении:
Как бы вы изменили ситуацию, если бы знали, что эта функция будет вызываться несколько раз в минуту, а производительность является проблемой?
Я использую это как способ проверки их латерального мышления. Поскольку вычисление простых чисел может быть медленным, так как максимальное значение становится больше, иногда имеет смысл просто использовать какую-то вычисленную или предварительно рассчитанную справочную таблицу, которая корректируется с учетом проблемы, которую вы пытаетесь решить.
Вот что заставляет задуматься: это просто, включает в себя немного математики и проверяет знания кандидата в области базового компьютерного дизайна (переполнение, числовое представление и т. Д.):
Напишите программу (или процедуру), которая принимает в качестве входных данных пару целых чисел X, Y и определяет, делится ли X * Y на 10. ВАЖНОЕ ПРИМЕЧАНИЕ: X и Y могут быть достаточно большими, чтобы X * Y переполнял самый большой доступный тип целых чисел на твоей машине.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
Заполните следующий метод: PS Режим числа - это число (в списке), которое встречается чаще всего.
public int getMode(List<Integer> numberList) {
}
Это чтобы увидеть эффективный ваш код.
Как бы вы представили запасную матрицу, которая относительно велика ... скажем, 1000x1000, но содержит не более 100 ненулевых записей?