Какая ваша любимая проблема с интервью на доске? [закрыто]


52

Как гласит заголовок, какая ваша любимая проблема с собеседованием на доске и почему она оказалась для вас эффективной?

Младший, старший, Java, C, Javascript, PHP, SQL, псевдокод и т. Д.


4
Проблемой, которую я ненавидел, была загадка Эйнштейна. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Я не смог сделать это за 30 минут. Но потом я разозлился и обнаружил следующее: games.flowix.com/en/index.html Так что я научился выполнять более сложные задачи 6 х 6 х 6 в среднем за 20 минут. Я думаю, что могу справиться с 5 х 5 х 5 за 30 минут. Какие бы глупые загадки ни бросил мне работодатель - я их запомню и в следующий раз буду их асом. Есть так много хороших головоломок.
Работа

20
@Job: ничего из этого не скажет вам ничего о том, как сотрудник будет выполнять свою работу. Если, конечно, вы не тратите все свое рабочее время на решение таких головоломок, вместо того, чтобы выполнять реальную работу.
Роберт Харви

1
@ Роберт Харви, ты имеешь в виду, что ты занимаешься бизнесом, который зарабатывает деньги иначе, чем разгадывая головоломки? Я понятия не имел ...;) Эта загадка, хотя весело. Как примечание: компания, на которой я работал, использовала фактические IQ-тесты в качестве первого шага при отборе. Я хотел бы найти несколько хороших вопросов доски, чтобы отделить лучших кандидатов, а не просто отсеивать их.
Николь

4
@Renesis: Как разработчик, я вижу, как решение головоломки определяет навыки решения проблем и анализа, но разработчики также должны знать, как перевести это решение в код. Решение головоломки показывает только половину этого выполнения. В этом разница между решением куба Rubix и написанием алгоритма решения куба Rubix.
Роберт Харви

@ Роберт Харви Я согласен, я специально ищу проблемы с кодированием, а не просто проблемы с мышлением.
Николь

Ответы:


22

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

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

Конкретный пример

(Для рабочего стола Java разработчик)

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

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


40

Я нашел это чрезвычайно интересным, когда брал интервью у кандидатов и отсеивал тех, у кого там не было бизнеса. По сложности он похож на 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 состоит в том, чтобы просто изменить оператор с ИЛИ на И в предложении где.


2
Ах, я вижу проблему с # 4. В ваших документах есть только одно ключевое слово на строку, поэтому вы не можете иметь ячейку, равную «
синему

8
По электронной почте Ой! Я могу видеть себя влюбленным (4) в интервью. @Job: Как интервьюер , я бы попросил кандидата объяснить вопрос, надеясь, что он наткнется на свою проблему, чтобы увидеть, как он справляется с этим. (это обычно говорит вам больше, чем кандидат, отвечающий на ваши вопросы с первой попытки.)
peterchen

3
@Renesis, я не уверен, что это действительно копание глубоко. Кажется, это очень хорошо для выяснения, если у кого-то есть базовые навыки SQL-запросов. Я на самом деле шокирован тем, как мало разработчиков имеют эти базовые навыки в наши дни.
Марк Фридман

2
@ jk01, может быть, я придерживаюсь старой позиции по этому поводу, но у IMO хорошо развитый разработчик должен быть некоторый опыт работы с БД, если не для доступа через код, а, по крайней мере, для понимания предметной области путем экспериментов с запросами. Без этого у разработчика есть довольно существенное слепое пятно. Это также чрезвычайно полезно для поддержки системы и устранения неполадок. Абстракция - это хорошо, чтобы помочь упростить разработку и повысить производительность, но я видел слишком много предположений, потому что это часто абстрагируется. Я мог бы продолжать, но это может быть целая другая дискуссия, я уверен, что это происходит в другом месте;)
Марк Фридман

4
@ back2dos - Слушай, не обижайся только потому, что не можешь ответить. Может быть много других технологий, которые делают это проще, но мы используем много баз данных SQL, и я набираю людей, которые знают, как использовать технологии, которые мы используем, а не оправдываюсь, почему они не должны отвечать на мои вопросы интервью ,
JohnFx

20

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


Как бы вы определили дизайн? Вы ищете диаграмму классов? Еще одна диаграмма UML? Базовый набросок ярусов?
justkt

1
Я называю их балунграммами. ;) Просто рисуйте циклы, ставьте имена и соединяйте их именными стрелками. Меня не волнует его заявление, а тот факт, что он это понял.
Uberto

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

3
@justkt: Важно то, что собеседник получает информацию. Это мало что значит как. Я встречал людей, которые действительно знают UML, которые не могут ничего объяснить с этим, и людей, которые могут объяснить сложные системы несколькими волнистыми линиями.
back2dos

2
С какой стати кто-то должен нарисовать дизайн проекта, не раскрывая чувствительных деталей?
Неманя Трифунович

14

Реализовать strcpy, strcmpи друзья.


4
Я прошу кандидатов реализовать atoi().
chrisaycock

2
Вы будете удивлены тем, сколько людей не могут реализовать strdup().
Тим Пост

10
Это справедливо, только если вакансия предназначена для программиста на Си.

В интервью для моей текущей работы интервьюер попросил меня включить strrev()или перевернуть строку. Мое решение для белой доски произвело на них впечатление, и сейчас я делаю работу.
Гульшан

@ crisaycock atoi () легко. itoa () обманчив
Майкл Браун

14

Мой фаворит, который охватывает несколько дисциплин, состоит в том, чтобы подсчитать количество узлов в двоичном дереве с учетом интерфейса (в 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();
    }
}

Как это демонстрирует знание:

  • как работает дерево (в частности, двоичное дерево)
  • рекурсивное определение двоичного дерева
  • рекурсивные методы и как базовые случаи останавливают рекурсию
  • что означает один узел
  • интерфейсы как контракт
  • (менее важно) знание синтаксиса C #:
    • дженерики
    • методы расширения
    • троичный оператор

Это может быть метод расширения?
Гульшан

В этот день и век, да. В то время мы кодировали в VS 2005, отсюда и редкий синтаксис.
Джесси С. Слайсер

Зачем использовать метод расширения, если у вас есть исходный код для исходного класса? Это не то, для чего нужны методы расширения.
Batibix

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

Святое дерьмо, которое очень похоже на Java!
тест

12

Два вопроса, которые вызвали для меня интересные дискуссии на доске:

  1. «Пожалуйста, объясните как можно подробнее, как веб-браузер получает сгенерированную страницу»
  2. «Пожалуйста, объясните, как работает Java Hibernate»

Они начинаются с простого, а затем становятся все более сложными.


31
Эхи, я даже не квалифицирован, чтобы судить об ответах ... Я думаю, что для второй вам нужно 12 черных свечей и коза ...
Uberto

4
Второе - это просто: ваша ОС сохраняет кэш-память и стек процессора, а также содержимое вашей оперативной памяти на жесткий диск, а затем восстанавливает его при повторном включении компьютера.
Malfist

Тем не менее, первый вопрос может занять несколько дней, чтобы объяснить.
Малфист

@Malfist Я имел в виду постоянную среду Java Hibernate.
Гэри Роу

2
@ Пол Стивенсон Да, но просто чтобы быть уверенным ...
Гари Роу

8

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

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

2) Для заданного двоичного дерева найдите глубину двоичного дерева. (Этот вопрос проверяет их способность писать рекурсивный код. Позвольте мне проверить, не поврежден ли их базовый случай.)

3) Напишите процедуру для двоичного поиска в массиве целых чисел. (Как говорит Джон Бентли (в Programming Pearls), многие люди, как правило, допускают ошибки при написании бинарного поиска. Затем можно найти ошибки, написать контрольные примеры, выполнить код и т. Д.)


+1, мне нравится, что ваш подход не имеет никакого смысла спрашивать кого-то о динамических программистах или подобных понятиях, когда они вряд ли используются в бизнес-программировании + Акцент должен делаться также на качестве кода, а не на одном решении.
Компьютерщик

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

Вероятно, следует убедиться, что люди знают, что вы имеете в виду «отсортированный массив» в (3), верно?
HaveAgess

7

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

Мы передали кандидату лист бумаги, используемый для отслеживания времени. Это было реальное расписание, используемое одним или нашими подразделениями. Мы попросили кандидата провести нас через процесс проектирования для создания лучшего инструмента отслеживания времени. Никаких границ, не говорил, на каком языке и т. Д., Просто хочу посмотреть, насколько хорош кандидат на «полном жизненном цикле». Это дало нам реальное представление о том, как они собирали требования. Как они структурировали таблицы базы данных, какой интерфейс они могли бы делать. Навыки общения, очевидно, были необходимы для этой задачи. Обычно это делалось в комнате с несколькими большими белыми досками и длилось до 2 часов.

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


6

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

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

У меня нет любимой. Задача, которую я выберу, сильно зависит от работы.

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


2
+1 За последний абзац, что все важно. Обычно в таких вещах важен не ответ, а путь к нему. Как все мои учителя математики когда-либо говорили "покажи свою работу!"
Orbling

4

Моим любимым был мой друг.

Напишите мне функцию для генерации / печати / хранения первых «n» простых чисел, а затем объясните, как это работает и насколько эффективно.

Это работает хорошо, потому что:

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

  2. Это не зависит от языка.

  3. Вряд ли кто-то понимает это правильно (обычно это крайний случай, который они пропускают (обычно 1 или 2)), или они не обрабатывают отрицательные числа, поэтому вы можете увидеть, как они обрабатывают ошибки, и им говорят, что они ошибаются.

  4. Большинство делают это как простое, но очень медленное сито (например, 80% людей проверят n как простое число, разделив n на все целые числа меньше n), что дает вам много возможностей для разговоров о том, как они могли бы улучшить алгоритм на основе о пространственно-временных компромиссах, например, «почему вы делите число на 4, если вы уже знаете, что оно не делится на 2?» или «Вы выяснили, что вам нужно только делить на все простые числа меньше, чем sqrt (n), но для этого требуется, чтобы вы где-то хранили эти числа, каковы последствия этого?»)

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


Однажды я получил вопрос об интервью, где мне дали очень запутанный блок кода на C, и попросил выяснить, что он делает. В очень округлой манере он печатал все остальные простые числа. 300 человек подали заявки, и они предложили мне работу, так как, очевидно, я был единственным кандидатом, который сказал им, какова была его цель, в отличие от получения ценностей. Так что да, +1, простые числа - хорошая проверка. Особенно, если они придумали сито, хотя это меняет вычислительную сложность на космическую сложность.
Orbling 22.12.10

1
1 не простое число ..

2
@ Thorbjørn - очевидно, но хороший процент подпрограмм, которые я видел, написанных для решения этой проблемы, сказал мне, что это так
Рис Гибсон

тогда у них есть ошибка :)

3

Что-то под названием 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. Довольно часто печальный момент, честно говоря.)


1
У вас когда-нибудь были кандидаты на собеседованиях? Или думаете, что вы просто развлекались за их счет вместо того, чтобы проводить серьезное интервью?
Николь

@Renesis: Я сначала смотрел на меня с ухмылкой. Некоторые из которых не прошли тест. В общем, хорошие кандидаты смеются, если выключены. Например, для программистов JS у меня было довольно много кандидатов, которые не дали ответа на интервью с «духом variablename = variablevalue;», тогда как хорошие просто смеялись по телефону или лично и прямо говорили мне, что будет с другим или без него. var).
Хайлем

1
@Renesis: Плюс, мне было бы наплевать, если кто-то обидится. Это не дискриминация в любом случае. Если они обидятся, то я предполагаю, что они из тех людей, которые не любят, когда их проверяют или допрашивают. У меня никогда не было заявителей, которые чувствовали, что мне весело за их счет. Я обычно даже извиняюсь перед тем, как задавать очень простые вопросы, поскольку это может показаться пустой тратой времени на хорошие. Но дело в том, что для меня это не пустая трата времени. Не спрашивая их, в долгосрочной перспективе.
Хайлем

@Renesis: И чаще всего, что нет, то, что я получил после ухмылки / смеха / оскорбленного взгляда, было стыдливым выражением и извинением того, кто не смог или начал писать ответвления для всего теста, когда они поняли, что это бесполезно. Да, я получаю удовольствие от этого теста, но я бы его не дал, если бы не было веской причины.
Хайлем

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

3

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

Для продвинутых кандидатов я иногда задаю следующий вопрос:

Это изображение показывает полумесяц. Ширина полумесяца от B до D составляет 9 см, а между E и F - 5 см. С является центром большего круга.

а) Пожалуйста, рассчитайте площадь полумесяца. Математический вопрос о полумесяце

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

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

Квадрат внутри круга внутри квадрата

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


1
Ответ для а) 128,75? (не знаю, сделал ли я какую-либо ошибку). Мне это нравится, но это больше о геометрии.
Hoàng Long

2
Также извините за задержку с комментированием. Я не люблю понижать голос, как правило, и вдвойне, не комментируя, почему. Мое отрицательное мнение касается не самого вопроса, оно определенно имеет для вас значение, я просто не думаю, что оно имеет надлежащий контекст в интервью по программированию.
Филипп Риган

7
-1 потому что геометрия является хорошим кандидатом для обучения в режиме Just In Time, и не влияет на мою способность создавать качественное программное обеспечение.
Malfist

2
Я наслаждался этой проблемой. Я надеюсь, что вы не возражаете, я поделюсь своим решением для части (а). Диаметры различаются на 9 см, поэтому если внутренний круг имеет радиус r, то внешний круг имеет радиус r + 4,5. Площадь полумесяца - это разность площадей окружностей: pi (r + 4.5) ^ 2 - pi * r ^ 2. Все, что осталось, это найти r. Определите C как точку (0,0), тогда точка E будет в (0, r - 0,5) (потому что CE на 5 см меньше, чем больший радиус). Внутренний круг смещен вправо на 4,5 см, поэтому его уравнение равно (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Подключите (x, y) = (0, r - 0.5) и решите для r.
Тим Гудман

2
+1, потому что я думаю, что это хороший вопрос для работы, которая требует геометрии. Здесь много рассуждений, а не просто включение в формулу. Тем не менее, я знаю некоторых хороших программистов, которые были бы обмануты только потому, что им не так много нужно было думать о кругах за 10 лет - но этот вопрос не задает подходящий вопрос для любого интервью с разработчиком. В настоящее время вопрос SQL с самым высоким рейтингом (который мне также нравится), по крайней мере, как специфический для работы.
Тим Гудман

3

Лучшие ответы 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));

1
Вы можете добавить, на каком конкретном диалекте SQL написано это.

Хорошо смотрится с функциональным стилем.
Orbling 24.12.10

2

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

  • Осведомленность о дизайне.

    «Покажите мне структуру таблицы для программы адресной книги, в которой есть Контакты с именами и фамилиями, которые могут иметь несколько телефонных номеров с описанием номера (ячейка / дом / работа / и т. Д.)»

    Я не ищу здесь диаграмму спецификации UML 2.0, простая пузырьковая диаграмма здесь подойдет. Пока это разумно.

  • Знание работы с базой данных (т.е. SQL)

    1. Напишите запрос, чтобы получить все номера телефонов для людей с фамилией "Смит"
    2. Напишите запрос, чтобы получить всех клиентов в базе данных, и номера телефонов для тех, кто с фамилией "Смит"
  • Знание тестирования

    Предположим, существует метод с сигнатурой, public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)который возвращает результаты вашего запроса ранее. Предположим, что если вы передадите null в метод, он выдаст исключение NullReferenceException. Напишите тест, чтобы продемонстрировать эту функциональность.

    Напишите тест, который продемонстрирует, что GetPhoneNumbers вернет номер домашнего телефона (123) 456-7890 для человека с фамилией «кузнец».

  • Знание того, как написать код

    Реализуйте метод, который будет соответствовать требованиям тестов, которые вы написали.


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


В SQL # 2 вы говорите о том, чтобы сделать все это одним запросом? Является ли целью просто оценить понимание левого / правого или внутреннего соединения?
Николь

@Renesis: Да, это так.
Стивен Эверс

2

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


2

Напишите алгоритм для следующей задачи: Учитывая число n , выведите общее количество (уникальных) двоичных деревьев, которые имеют n узлов.

Таким образом, для n = 0 и n = 1 ответ равен 1. Для n = 2 у вас есть 2: корневой узел, а затем второй узел либо слева, либо справа.

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

См. Также это обсуждение StackOverflow для связанного, но другого случая деревьев бинарного поиска.]


Так программист пользовательского интерфейса, который не знает динамического программирования, является плохим программистом? Какого черта любой бизнес-программист, который не может вспомнить динамическое программирование, плох? Многие подростки в topcoder пройдут через проблему динамического программирования, но, пожалуйста, взгляните на код, который они пишут.
Компьютерщик

@Geek: Помните, что проблемы «доски» - это способ увидеть чей-то мыслительный процесс. Проблемы динамического программирования должны быть в этом обсуждении, так как они очень популярны среди Google.
Макнейл

Я не согласен, но у меня есть два вопроса. 1. Решение неизвестного? Проблемы DP становятся прогулкой в ​​парке, если вы решили некоторые проблемы в недавнем прошлом или вы все еще помните эту концепцию вне колледжа. Кто-то, кто забыл это, определенно не преуспеет на белой доске. 2. Если кто-то изо всех сил пытается решить проблему, вы никак не можете измерить качество его кода. Как насчет того, чтобы задать проблему для чего-то вроде LinkList или Strings или Arrays, чтобы человек мог решить проблему и написать код.
Компьютерщик

Я бы не ожидал, что собеседник все сделает правильно, однако некоторые компании это сделают.
Макнейл

@Geek: «... программист, который не знает, что динамическое программирование - плохой программист?» - да . Тем не менее, я согласен, что мышление в динамическом программировании не тривиально, когда вы не привыкли к нему. Но знать это абсолютно необходимо.
Конрад Рудольф

2

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

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


2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

Многие ребята могли застрять на этом. Если дано какое-то решение - обычно оно использует рекурсию. После того:

Implement the same via 'for'-loop

Не могу сказать, сколько ребят не справились с обеими задачами - 50% кандидатов.
Вот почему мне это нравится :)


Что, если первая реализация выполняется через цикл for?
Темная ночь

2
Рекурсивную версию предлагается реализовать. Обычно после цикла for парни успешно реализуют рекурсивную версию.
alexb

Или вы могли бы реализовать это как одно утверждение: fib(n)=round(power(PHI,n)/SQRT5). PHI и SQRT5 - это константы, представляющие золотое сечение (1,618 ...) и квадратный корень из 5 соответственно.
oosterwal

2

Для баз данных я иду с:

Таблица: вещи

Имя 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 Дейв

Я люблю его, потому что:

  • Дедупликация - это проблема реального мира
  • Есть множество способов сделать это
  • Я думаю, что в значительной степени для всех этих способов вам нужно либо понять (немного) более сложный SQL (по сути, GROUP BY и HAVING), либо уметь рассуждать путем объединения нескольких более простых операторов.
  • Из-за этого последнего бита, даже если они борются с синтаксисом или чем-то еще, вы можете спросить их, что они думают, и обсудить это таким образом.
  • Это ссылается на доктора Сьюза

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


1
Я думаю, я не знаю, что считать «совершенно тривиальным» ... Что-то вроде SELECT min(ID), Name FROM Things GROUP BY Nameбы сработало, верно?
Тим Гудман

@ Тим - Это дает вам счет за все. Я хочу только те с дубликатами. Отредактированные вручную результаты не учитываются, предположим, что они масштабируются до миллионов строк. Это легкая проблема, но по моему опыту 80% людей, утверждающих, что знают SQL, не могут достичь даже вашего первого удара.
Джон Хопкинс

@Jon: Не уверен, что вы подразумеваете под "Это дает счет за все". Из вашего примера решения, похоже, что вы хотите, чтобы по одной строке для каждого отдельного имени. Из ваших комментариев кажется, что вы, возможно, имеете в виду что-то подобное HAVING count(Name) > 1, но тогда, я думаю, ваш пример ответа не должен включать Бодкина Ван Хорна, Hot Shot, Snimm и Dave.
Тим Гудман

@ Тим - Ты прав, это действительно неясно. Я отредактирую, когда у меня будет несколько минут.
Джон Хопкинс

1
Я думаю, я бы сделал это DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). У вас есть предпочтительное решение?
Тим Гудман

2

Моя любимая проблема с 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;

Из этого я могу научиться

  • если кандидат признает, что вы не можете перегрузить тип возвращаемого значения (указание уровня C ++ младшего уровня)
  • если кандидат знает, как вернуть временный и реализовать операторы приведения (указание на C ++ промежуточного уровня)
  • если кандидат может выполнять базовую векторную математику (важно для нашей прикладной области)

2

Как бы вы представляли стандартную колоду из 52 карт? Любой язык программирования в порядке. Как бы вы перемешали карты?


vector <Card> с функцией перемешивания в C ++ :)
правостороннее

1

Мой любимый - начать с запроса прототипа printf. Затем, учитывая низкоуровневый API printc (char c), который будет печатать один символ, реализуем printf. Дает всевозможные интересные ответы, такие как стек является частью процессора. Как вы уже догадались, я из C и встроенного фона.


Я не понимаю, что «стек является частью процессора».
Барджак

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

@aufather: Если я правильно помню, вам нужно вызвать varargs()или какую-то функцию, подобную этой. Я прав? Я сделал это только один раз, чтобы сказать, что сделал это некоторое время назад.
Майкл К

@barjak - Как только вы начнете реализовывать printf, вам нужно будет получить доступ к вашему стеку, и у меня есть ответы, что стек находится в CPU.
2010 г.

@Michael - во встроенном мире вам нужно очень хорошо знать архитектуру вашей платформы. Таким образом, этот вопрос быстро отсеивает невежественных довольно рано.
2010 г.

1

У вас есть миска с 200 рыбами. 99% этих рыб не являются гуппи. Сколько рыбы вы должны удалить, чтобы 2% того, что осталось, было гуппи. Показать свою работу.

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

Вы будете удивлены, как много людей ошибаются.


4
Добавьте два 12-дюймовых Оскара в миску, они очень скоро удалят 98% гуппи.
Компьютерщик

Что произойдет, если вы удалите гуппи?

1
1% гуппи = 200 x 1% = 2 (200-2 = 198 других рыб), где 2 = 2%, оставшаяся рыба = 98% = 98 (1: 1). 98 = 198 - 100 => answer = 100. [Предполагая, что вы можете выборочно выбрать другую рыбу. Если удалить гуппи, есть и другие ответы.] Хороший вопрос, вы будете удивлены, как мало людей справляются с этим, хотя для программиста это должно быть детской забавой.
Orbling 25.12.10

1

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

1) Реализация базового общего указателя, объяснения того, где есть недостатки по сравнению с tr1 или общими указателями boost в их реализации, как его следует использовать и т. Д.

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


1

Один вопрос, который я использовал с тех пор, как он был использован для меня, заключается в следующем:

Напишите функцию для печати всех чисел от 1 до 100.

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

Как бы вы изменили функцию для печати всех чисел от 1 до 1000, 10000 или n ?

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

Двигаемся в другом направлении:

Как бы вы изменили ситуацию, если бы знали, что эта функция будет вызываться несколько раз в минуту, а производительность является проблемой?

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


1

Вот что заставляет задуматься: это просто, включает в себя немного математики и проверяет знания кандидата в области базового компьютерного дизайна (переполнение, числовое представление и т. Д.):

Напишите программу (или процедуру), которая принимает в качестве входных данных пару целых чисел 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));
}

0

Заполните следующий метод: PS Режим числа - это число (в списке), которое встречается чаще всего.

public int getMode(List<Integer> numberList) {


}

Это чтобы увидеть эффективный ваш код.


-2

Как бы вы представили запасную матрицу, которая относительно велика ... скажем, 1000x1000, но содержит не более 100 ненулевых записей?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.