Яка улюблена проблема інтерв'ю на дошці? [зачинено]


52

Як видно з назви, яка ваша улюблена проблема інтерв'ю на дошці, і чому вона виявилася ефективною для вас?

Молодші, старші, Java, C, Javascript, PHP, SQL, псевдо-код тощо.


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

20
@Job: жоден з них не скаже вам нічого про те, як працівник буде виконувати цю роботу. Якщо, звичайно, ви не витрачаєте весь свій робочий час на вирішення подібних головоломок, а не на фактичну роботу.
Роберт Харві

1
@ Роберт Харві, ти маєш на увазі, що ти займаєшся бізнесом, який заробляє гроші іншим способом, ніж розгадування загадок? Я не мав уявлення ...;) Ця головоломка хоч і весела. В якості додаткового зауваження, компанія, в якій я працював, використовувала фактичні тести на IQ як перший крок у їх скринінгу. Я хотів би знайти кілька хороших запитань на дошці, щоб розділити найкращих кандидатів, а не просто їх екранувати.
Ніколь

4
@Renesis: Як розробник, я бачу, як розгадування головоломки визначає навички розв’язання та аналізу проблем, але розробники також повинні знати, як перекласти це рішення в код. Розв’язування головоломки показує лише половину цього виконання. Це різниця між вирішенням куба Рубікса і написанням алгоритму для вирішення куба Рубікса.
Роберт Харві

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

Відповіді:


22

Я прошу кандидата створити рішення проблеми, з якою я насправді стикався в своїй щоденній роботі. Роблячи це, я намагаюся створити діалог між мною та кандидатом. Я намагаюся обговорити про дизайн, який він будує, наче я ніколи раніше не замислювався над проблемою.

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

Конкретний приклад

(Для розробника java desktop)

Створіть 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
Ах, я бачу випуск w / # 4. У ваших документах є лише одне ключове слово в рядку, тому ви не можете мати клітинку, рівну як "Синій", так і "Жовтий", знає свідомо
glasnt

8
Ой! Я можу побачити, як я потрапив (4) в інтерв'ю. @Job: Як інтерв'ю , я б попросив кандидата пояснити запит, сподіваючись, що він наткнеться на свою проблему, щоб побачити, як він з цим справляється. (що зазвичай говорить вам більше, ніж кандидат, який звертається з вашими питаннями при першій спробі.)
peterchen

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

2
@ jk01, можливо, у мене є старе шкільне ставлення до цього, але IMO, всебічний розробник повинен мати деякі знання БД, якщо не для доступу через код, але, принаймні, для розуміння домену, експериментуючи із запитами. Без цього у розробника є досить значна сліпа пляма. Він також НАДКРИТО корисний для підтримки системи та усунення несправностей. Абстракція чудово допомагає спростити розвиток і збільшити продуктивність, але я бачив занадто багато припущень, зроблених, тому що це так часто абстрагується. Я міг би продовжувати, але це могла бути ціла інша дискусія, я впевнений, що відбувається деінде;)
Марк Фрідман

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

20

"Намалюйте для мене на дошці дизайн останнього проекту, над яким ви працювали, не розкриваючи мені жодної чутливої ​​деталі".


Як би ви визначили дизайн? Шукаєте схему занять? Ще одна схема UML? Основний ескіз ярусів?
justkt

1
Я називаю їх балограмами. ;) Просто намалюйте цикли, поставте назви та з'єднайте їх із названими стрілками. Мене не хвилює його заява, а те, що він це зрозумів.
Уберто

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

3
@justkt: Важливо те, що респондент отримує всю інформацію. Мало значення, як. Я зустрів людей, які насправді знають UML, які нічого не можуть пояснити, і людей, які можуть пояснити складні системи кількома чіткими лініями.
back2dos

2
Як на Землі хтось повинен намалювати проект проекту, не розкриваючи жодної чутливої ​​деталі?
Неманья Трифунович

14

Реалізувати strcpy, strcmpі друзі.


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

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

10
Це справедливо, лише якщо відкриття робочих місць призначено для програміста C.

В інтерв'ю для моєї поточної роботи інтерв'юер попросив мене реалізувати 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

'spose, я міг би піти на рівень глибше і показати кандидату інтерфейс, який цей клас реалізує. Суть полягає в тому, що оригінальний клас не потрібно змінювати - деякі розробники початкового рівня хотіли б додати речі до класу, щоб зробити запит "простішим".
Джессі К. Слікер

святе лайно, яке дуже схоже на java!
тест

12

Два питання, які викликали цікаві для мене дискусії на дошці

  1. "Будь ласка, можете пояснити якомога детальніше, як вам подобається, як веб-браузер отримує створену сторінку"
  2. "Будь ласка, поясніть, як працює сплячка Java"

Вони починаються просто, а потім стають прогресивно складнішими.


31
ехі, я навіть не кваліфікований, щоб судити відповіді ... я думаю, що для другого вам потрібно 12 чорних свічок і козел ...
Uberto

4
Друге - це просто, ваша ОС зберігає кеш-пам'ять процесора та стек та вміст оперативної пам’яті на жорсткому диску, а потім відновлює її, коли комп’ютер знову увімкнено.
Мальфіст

Однак на перше запитання можна було пояснити кілька днів.
Мальфіст

@Malfist Я мав на увазі основу стійкості Java Hibernate.
Гері Роу

2
@Paul Stephenson Так, але просто, щоб бути впевненим ...
Gary Rowe

8

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

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

2) Давши двійкове дерево, знайдіть глибину двійкового дерева. (Це питання перевіряє їх здатність писати рекурсивний код. Дозволяє мені перевірити, чи є їх базовий регістр неушкодженим.)

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


+1, мені подобається, що ваш підхід не має сенсу питати когось із динамічних програмістів або подібних понять, коли вони навряд чи використовуються в бізнес-програмуванні + наголос має бути на якості коду, а не на рішенні.
Geek

Я не проти дизайнерських питань, але одного разу я брав інтерв'ю з хлопцем, хобі якого займався головоломками, і у нього були жахливі запитання. Це було так, як я задаю комусь питання бойових мистецтв.
Боб Мерфі

Напевно, має переконатися, що люди знають, що ви маєте на увазі "відсортований масив" в (3), правда?
HaveAGuess

7

Ми використовували це в одній компанії, в якій працював.

Ми передали кандидату аркуш паперу, який використовується для відстеження часу. Це був реальний графік роботи, який використовував один чи наш підрозділ. Ми попросили кандидата провести нас через процес розробки для створення кращого інструменту відстеження часу. Ніяких меж, не сказала, яка мова і т. Д., Просто хочу побачити, наскільки хороший кандидат був на "повному життєвому циклі". Це дало нам реальне уявлення про те, як вони зібрали вимоги. Як вони структурували таблиці баз даних, який інтерфейс вони можуть робити. Для цього завдання, очевидно, були потрібні навички спілкування. Зазвичай це робилося в кімнаті з кількома великими білими дошками і тривало аж 2 години.

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


6

Я використовую проблему, що стосується мого домену програмування.

Якщо я розробляю веб-програми, я хочу побачити, як вони можуть скласти веб-форму, яка видаляє записи, і який підхід вони можуть застосувати до видалення запису з бази даних, наприклад. Це говорить мені, якщо вони знають основні принципи бази даних, як вони взаємодіють з користувачем для перевірки видалення та чи знають вони, що таке м'яке видалення.

У мене немає улюбленого. Проблема, яку я обираю, буде сильно відрізнятися залежно від роботи.

Мені все одно, чи можуть вони вирішити проблему повністю чи ні в інтерв'ю, якими технологіями та мовами вони користуються чи наскільки шалено виглядає їхній код на дошці. Я шукаю шаблон думки; Я хочу побачити, чи знають вони, як продумати та вирішити проблеми.


2
+1 Для останнього абзацу, який є всім важливим. Зазвичай у таких речах важлива не відповідь, а шлях, який потрібно пройти туди. Як усі мої вчителі з математики коли-небудь говорили "покажи свою роботу!"
Увімкнення

4

Моїм улюбленим був один мій друг.

Напишіть мені функцію, щоб генерувати / друкувати / зберігати перші "n" прості числа, а потім поясніть, як це працює і наскільки ефективно воно.

Це добре працює, тому що:

  1. Це алгоритмічне запитання, тому він вимагає, щоб опитуваний міг подумати, а потім пояснити своє мислення - так ви зможете побачити, як працює їхній мозок.

  2. Це мова незалежна.

  3. Навряд чи хтось зрозуміє це цілком правильно (зазвичай є звичайні випадки, які вони пропускають (1 або 2 зазвичай), або вони не обробляють негативні цифри, тож ви можете побачити, як вони обробляють помилки і повідомляють, що вони помиляються.

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

У них немає необхідності в правильній відповіді. Якщо хтось може подумати і пояснити своє мислення, то він буде довгим шляхом, бо бути хорошим кандидатом.


Одного разу я отримав запитання про інтерв'ю, де мені дали дуже затуманений блок коду С, і попросив дізнатися, що це робило. Дуже крутим способом було надруковано всі інші прості номери. 300 людей подали заявку, і вони запропонували мені роботу, оскільки, мабуть, я був єдиним кандидатом, який сказав їм, яка мета цього, на відміну від отримання цінностей. Так що так, +1, праймери - це хороша перевірка. Особливо, якщо вони придумують сито, хоча це торгує обчислювальною складністю для просторової складності.
Увімкнення

1
1 не є основним ..

2
@ Thorbjørn - очевидно, але хороший відсоток процедур, які я бачив, написаних для вирішення цієї проблеми, сказав мені, що це
Rhys Gibson

то вони мають помилку :)

3

Щось під назвою aff_z, яке було частиною іспитів моєї школи інженерії та було використано як "манекенний" тест, щоб студенти не змогли повернутися з канікул (наша система оцінювання передбачала, що невдача перевірка зупинила маркування, тому невдача цього тесту манекена буде визнати недійсним цілий тест. Змусити вас звернути увагу на диронічні подробиці). Я повторно використовував це один чи два рази під час співбесіди.

У будь-якому випадку ... Я забув точну формулювання, але це було щось подібне ...

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см. C - центр більшого кола.

а) Будь ласка, обчисліть площу півмісяця. Питання математики півмісяця

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

Для більш легкого запитання я зазвичай даю такий же питання, але використовую приклад "квадрат у колі в межах квадрата". Хоча це дуже просто, тому я б очікував ідеальної алгебри на ній.

Квадрат всередині кола всередині квадрата

Крім цього, я схильний просити їх створити алгоритм для генерації всіх комбінацій набору даних змінної довжини.


1
Відповідь за а) - 128,75? (не знаю, чи я помилився). Мені це подобається, але це більше стосується геометрії.
Хоанг Лонг

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

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

2
Мені сподобалася ця проблема. Сподіваюсь, ви не заперечуєте мені, поділившись моїм рішенням на частину (а). Діаметри відрізняються на 9 см, тому якщо внутрішнє коло має радіус r, зовнішнє коло має радіус r + 4,5. Площа півмісяця - це різниця в площах кіл: pi (r + 4,5) ^ 2 - pi * r ^ 2. Залишилось лише знайти r. Визначте C як точку (0,0), тоді точка E знаходиться на (0, r - 0,5) (оскільки СЕ на 5 см менше, ніж більший радіус). Внутрішнє коло зміщено вправо на 4,5 см, тому його рівняння дорівнює (х - 4,5) ^ 2 + у ^ 2 = г ^ 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 написано це.

Чудово виглядає з функціональним стилем.
Увімкнення

2

Я шукаю кілька речей у кандидатів, з якими я брав інтерв'ю. Через те, що я не можу описати в Інтернеті, ми отримуємо досить бідних кандидатів, і я прийшов очікувати цього, тому мені досить легко. Ще я шукаю:

  • Поінформованість дизайну.

    "Покажіть мені структуру таблиці програми адресної книги, яка містить контакти з іменами та прізвищами, які можуть мати декілька номерів телефонів із описом номера (комірка / дім / робота / тощо)."

    Я не шукаю тут специфікаційну діаграму UML 2.0, тут проста нормальна бульбашкова діаграма. Поки це розумно.

  • Знання роботи з базою даних (тобто SQL)

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

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

    Напишіть тест, який демонструє, що GetPhoneNumbers поверне домашній номер телефону (123)456-7890 для когось з прізвищем "коваль".

  • Знання, як написати якийсь код

    Реалізуйте метод, який відповідає вимогам тестів, які ви написали.


Враховуючи кількість та якість заявників, яких ми отримали, я взяв інтерв’ю у всіх, хто колись серйозно звертався. Я нікого не наймав.


Ви в SQL №2 говорите про те, щоб зробити це все за один запит? Чи є мета просто оцінити розуміння лівих / правих чи внутрішніх приєднань?
Ніколь

@Renesis: Так.
Стівен Еверс

2

Зазвичай я дозволяю їм накреслити блок-схему останньої системи, над якою вони працювали, розпитуючи про відносини між блоками, а також дозволяю їм детальніше розкривати блок, над яким вони працювали / відповідали. З цієї вправи ви можете багато чого навчитися, наприклад, як виглядає людина, що виходить за межі свого маленького домену, наскільки йому важливо знати, "де" він діє, також ви можете дізнатися про роль, яку він грав, чи була це ключовою чи стороною роль.


2

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

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

Ви можете ознайомитись із методами проектування та побачити, чи думають вони про рекурсію чи запам'ятовування чи рішення щодо динамічного програмування.

[Дивіться також цю дискусію щодо StackOverflow для пов’язаного, але іншого, випадку бінарних дерев пошуку.]


Отже програміст інтерфейсу, який не знає динамічного програмування, поганий програміст? Для біса це поганий будь-який бізнес-програміст, який не може згадати динамічне програмування? Багато підлітків у топкодері пройдуть проблему динамічного програмування, але, будь ласка, подивіться на код, який вони пишуть.
Geek

@Geek: Пам'ятайте, що проблеми "дошки" - це спосіб побачити чийсь процес думки. Проблеми динамічного програмування повинні належати до цієї дискусії, оскільки вони користуються великою популярністю серед Google.
Macneil

Я не згоден, але у мене є два питання. 1. Розв’язування невідомого? Проблеми з ДП стають прогулянками по парку, якщо ви вирішили деякі проблеми в недавньому минулому або все ще пам’ятаєте концепцію поза коледжем. Хтось забув це, напевно, не буде добре на білій дошці. 2. Якщо хтось намагається вирішити проблему, ви не зможете кількісно оцінити його якість коду. Як щодо надання проблеми на щось на кшталт LinkList або Strings або масивів, щоб людина могла вирішити проблему і написати код.
Geek

Я не обов'язково розраховував, що співбесідник все це виправить, проте деякі компанії хочуть.
Macneil

@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-loop успішно реалізують рекурсивну версію.
alexb

Або ви могли б реалізувати це як одне твердження: fib(n)=round(power(PHI,n)/SQRT5). PHI і SQRT5 - константи, що представляють відношення золота (1.618 ...) і квадратний корінь 5 відповідно.
oosterwal

2

Для баз даних я відвідую:

Таблиця: Речі

Ідентифікаційне ім’я
1 Бодкін Ван Ріг
2 Хоос-Фус
3 Хоос-Фус
4 Hot-Shot
5 Обличчя повітряної кулі Марвіна О'Гравеля
6 Сонім
7 Обличчя повітряної кулі Марвіна О'Гравеля
8 Обличчя повітряної кулі Марвіна О'Гравеля
9 Дейв

Напишіть мені якийсь SQL, який зніме копію такої таблиці на основі імені (і мені все одно, який ідентифікатор я отримаю назад, але той, який повернуто, повинен бути дійсним для цього імені). Таким чином, таблиця після того, як до неї застосовано правильний SQL, буде представляти щось на зразок:

Таблиця: Речі

Ідентифікаційне ім’я
1 Бодкін Ван Ріг
2 Хоос-Фус
4 Hot-Shot
5 Обличчя повітряної кулі Марвіна О'Гравеля
6 Сонім
9 Дейв

Мені це подобається тому що:

  • Дедуплікація - реальна світова проблема
  • Існує купа способів зробити це
  • Я думаю, що майже всі ці способи потребують того, щоб ви зрозуміли (трохи) складніший SQL (по суті, GROUP BY і HAVING) або вміння міркувати через ланцюжок кількох більш простих висловлювань.
  • Через цей останній шматочок, навіть якщо вони борються з синтаксисом чи будь-яким іншим, ви можете запитати їх, що вони думають, і говорити через це таким чином.
  • У ньому згадується доктор Сеус

(Ось де я знаходжу, що існує якийсь абсолютно тривіальний спосіб зробити це, і я над цим ускладнював усі ці роки).


1
Я думаю, я не знаю, що вважається "цілком тривіальним" ... Щось подібне SELECT min(ID), Name FROM Things GROUP BY Nameспрацювало б, правда?
Тім Гудман

@Tim - це дає вам рахунку за все. Я хочу лише тих, що мають дублікати. Результати, відредаговані вручну, не враховують, припустимо, що це масштабування до мільйонів рядків. Це проста проблема, але, за моїм досвідом, 80% людей, які стверджують, що знають SQL, не можуть дістатись навіть до першого удару.
Джон Хопкінс

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

@Tim - Ти маєш рацію, це дійсно незрозуміло. Я відредагую, коли отримаю кілька хвилин.
Джон Хопкінс

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 ++ проміжного рівня)
  • якщо кандидат може займатися базовою векторною математикою (важливо для нашої програми)

2

Як би ви представляли стандартну колоду на 52 картки? Будь-яка мова програмування - це добре. Як би ви пересували картки?


вектор <Card> з функцією переміщення C ++ ':)
праворуч

1

Моє улюблене - почати із запитання прототипу printf. Потім дається API printc низького рівня (char c), який буде друкувати один символ, реалізувати printf. Дає всілякі цікаві відповіді, як стек є частиною процесора. Як ви могли здогадатися, я із С та вбудованого фону.


Я не розумію, що "стек є частиною процесора".
barjak

Кожен, хто щось знає про архітектуру комп’ютера, знав би це. Для мене це абсолютно не пов'язано, тому хлопець демонструє своє невігластво.
Майкл К

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

@barjak - Після того, як ви почнете реалізовувати printf, вам потрібно буде отримати доступ до свого стека, і я отримав відповіді, що стек знаходиться в процесорі.
батько

@Michael - У вбудованому світі вам потрібно добре знати свою архітектуру платформи. Тож це питання досить швидко вириває невігласів.
батько

1

У вас є миска з 200 рибами. 99% цих риб не є гуппі. Скільки риби слід вийняти, щоб 2% того, що залишилося, були гуппі. Покажіть свою роботу.

Йдеться про заплутані вимоги. Так сказано, щоб змінити точки зору кілька разів під час одного і того ж питання. Мається на увазі побачити, чи зможуть вони зрозуміти, що насправді відбувається.

Ви були б здивовані, скільки людей помиляються.


4
Додайте в чашу два 12-дюймові оскари, вони дуже скоро вийдуть 98% гуппі.
Geek

Що станеться, якщо ви видалите гуппі?

1
1% гуппі, = 200 х 1% = 2 (200-2 = 198 інших риб), де 2 = 2%, решта риби = 98% = 98 (1: 1). 98 = 198 - 100 => answer = 100. [Припускаючи, що ви можете вибірково відбирати іншу рибу. Якщо вилучаєте гуппі, є й інші відповіді.] Добре запитання, ви здивуєтеся, як мало хто справляється з цим добре, хоча це має бути дитяча гра для програміста.
Увімкнення

1

У мене є кілька фаворитів, але ось пара, яка майже завжди приходить. Більшу частину часу я роблю заключні технічні інтерв'ю (C ++), тому надаю перевагу більш довгим та відкритим питанням, які призводять до нових цікавих сфер. Немає «правильної» відповіді, лише відкриття до іншої розмови.

1) Впровадження базового загального вказівника, пояснення, де є недоліки порівняно з tr1 або збільшити загальні покажчики при їх реалізації, як його слід використовувати тощо.

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.