Подтвердить что ты не робот

С++ интервью - тестирование потенциальных кандидатов

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

У кого-нибудь есть предложения?

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

Поэтому любые предложения по этим направлениям будут очень благодарны!

4b9b3361

Ответ 1

Я бы не стал заставлять их писать код. Вместо этого я бы дал им пару фрагментов кода для обзора.

Например, первое касается проектирования по контракту: посмотрите, знают ли они, что такое предварительные условия, постусловия и инварианты. Сделайте пару небольших ошибок, например, никогда не инициализируйте целочисленное поле, но утверждая, что в инварианте оно> = 0, и посмотрите, заметят ли они их.

Вторым было бы дать им bool contains(char * inString, char c). Реализуйте это с помощью тривиального цикла. Затем спросите, есть ли ошибки. Конечно, ваш код здесь не проверяет наличие нуля во входном параметре inString (даже если в самом предыдущем вопросе говорилось о предварительных условиях!). Кроме того, цикл заканчивается на символе 0. Конечно, кандидат должен определить возможные проблемы и настаивать на использовании std::string вместо этого char * crap. Это важно, потому что, если они будут жаловаться, вы будете знать, что они не будут добавлять свой собственный char * в новый код.

Альтернатива, которая обращается к контейнерам STL: дайте им std::vector<int> и код, который ищет простые числа или считает нечетные числа или что-то еще. Сделайте небольшую ошибку. Посмотрите, найдут ли они какие-либо проблемы и поймут ли они код. Спросите, в какой ситуации лучше использовать std::set (когда вы собираетесь искать элементы достаточно систематически, и оригинальный порядок входа не имеет значения.).

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

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

Ответ 2

Этот - это очень сложная задача, хотя она выглядит совершенно безобидной.

Ответ 3

Я считаю, что программисту на С++ требуется больше, чем просто общие навыки программирования, потому что...

В С++ тяжелее стрелять в ногу, но когда вы это делаете, вы сбрасываете всю ногу.

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

Одна вещь, которую я назову "педантичность". Вы знаете, как некоторые люди могут сразу выявить орфографические ошибки? Программист С++ должен уметь обнаруживать простые ошибки, когда они читают или пишут код (независимо от того, является ли этот код собственным или нет). Программист, который опирается на метод "компиляции и тестирования" только для того, чтобы избавиться от простых ошибок, несовместим с языком С++, потому что эти ошибки не всегда приводят к немедленному сбою в С++.

Программисты на C++ также нуждаются в хорошем знании низкоуровневого материала. Указатели, распределители памяти, блокировки, блокировки. И "nitty gritty" С++ проблемы, такие как множественное наследование и скрытие метода и тому подобное, особенно если им нужно поддерживать код других людей.

Наконец, программисты на C++ должны иметь возможность писать код, который легко использовать другим людям. Могут ли они хорошо создать материал?

Хорошим тестом для первых двух областей является "Вот некоторый код на С++, который я получил в Интернете. Найдите ошибки и определите ненужные биты". (Там есть очень плохой код на С++, доступный в Интернете, и часто программист делает ненужные вещи из-за ошибочного понимания того, как быть "безопасным" на С++.)

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

Ответ 4

Несколько вопросов могут позволить вам узнать много о кандидате:

  • Различия между указателем и ссылкой, когда вы будете использовать их каждый?
  • Почему вы создали виртуальный деструктор?
  • Где задан порядок построения атрибутов класса?
  • Конструктор копирования и оператор =. Когда вы их реализуете? Когда вы сделаете их частными?
  • Когда вы будете использовать интеллектуальные указатели? что бы вы приняли во внимание, чтобы решить, что?
  • Где еще вы видели идиому RAII?
  • Когда вы создадите параметр const? когда метод?
  • Когда вы измените атрибут?
  • Что такое виртуальное наследование?
  • Что такое специализация шаблонов?
  • Каковы черты?
  • Что такое политика?
  • Что такое SFINAE?
  • Что вы знаете о стандарте С++ Ox?
  • Какие библиотеки ускорений вы использовали?
  • Какие книги на С++ вы прочитали? (Sutter? Alexandrescu?)

Некоторые короткие упражнения (не более 10 минут) относительно контейнеров STL, управления памятью, нарезки и т.д. также будут полезны. Я бы позволил ему сделать это на компьютере с готовой средой. Важно следить за ловкостью.

Ответ 6

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

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

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

Ответ 7

"Напишите программу, которая получает 3 целых числа в диапазоне 0..2 ^ 32-1 и проверяет, представляют ли они действительные ребра треугольника".

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

  • Правильный тип использования должен быть без знака длинным. Многие "программисты" здесь не сработают.
  • Нулевые значения следует считать недействительными.
  • Следует избегать переполнения: "if (a + b <= c) return false" является проблематичным, поскольку a + b может вызвать переполнение.
  • если (a <= c-b) также является плохим решением, так как c-b может быть отрицательным. Не очень хорошо для неподписанных типов.
  • if (c > b) {if (a <= c-b) возвращает false; } else {if (a <= b-c) возвращает false; } Это выглядит намного лучше, но оно не будет работать корректно, если (a >= b + c).

Хороший программист должен быть ориентирован на детали. Это простое упражнение поможет проверить, есть ли он.

Ответ 8

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

Ответ 9

В зависимости от того, как выглядит ваша предварительная проверка вашей организации, предположите, что человек ничего не знает о С++ и только что записал свое резюме, потому что это заставляет их выглядеть супертехническими. Шутки в сторону. Начните с чего-то простого, например, смены строки. У меня были кандидаты, которые не могли даже написать прототип функции для этого!

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

Вот мой ответ на аналогичный вопрос, связанный с С#, но обратите внимание, что мой ответ - агностик. Мой вопрос интервью, фактически, в C. Я редко беседую с человеком с целью выяснить, могут ли они программировать. Я хочу узнать, могут ли они думать, решать проблемы, сотрудничать, общаться, понимать что-то новое и так далее. В то же время я обхожусь вокруг, пытаясь понять, "не поняли ли они" с точки зрения большой картины разработки программного обеспечения. Я использую вопросы программирования, потому что это общая основа и простая уловка.

Ответ 13

Получить Codility.com, чтобы отключить программисты, не программируемые, это даст вам ограниченное количество в основном реабируемых кандидатов. Сидите в течение часа с каждым из них и пытайтесь собрать что-то вместе (микро-веб-сервер, script для обработки некоторых ваших данных, простой графический интерфейс). Обратите внимание на навыки общения, т.е. Сколько усилий требуется для понимания кандидата. Спросите кандидата на рекомендации книг, связанных с предметом (разработка программного обеспечения на С++ в вашем случае). Следуйте Guerilla Guide to Interviewing, то есть ответьте себе честно, если человек умный и все сделает. Удачи.

Ответ 14

Отметьте 10 вопросов по обсуждению на С++ от Tests4Geeks.

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

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

Ответ 15

Что бы вы ни делали, спаривание было бы хорошей идеей. Придумайте хорошую программу и пообщайтесь с парнем и решите проблему. ИМХО, что очень хорошая идея

Ответ 16

У кого-нибудь есть предложения?

Я бы рекомендовал получить копию этого:

http://www.amazon.co.uk/Programming-Interviews-Exposed-Secrets-Programmer/dp/047012167X/ref=sr_1_1?ie=UTF8&s=books&qid=1252499175&sr=8-1

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

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

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

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

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

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

например, покажите им определение класса, содержащее переменную-член ссылки, а реализация конструктора с отсутствием ссылочной инициализации.

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

Я бы начал просто...

Покажите им пример кода, который передает строки функции по значению. (строки не должны быть изменены в функции). Вы должны проверить, что они исправляют код, чтобы передать строки по ссылке const.

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

Наконец, задайте им простые вопросы о выборе структуры данных.

например. Когда они должны использовать список, а не вектор.

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

Ответ 17

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

Вот полный список тем:

  • Основы: ссылки и указатели, Const Correctness, Explicit
  • Стандартная библиотека
  • Дизайн классов, перегрузка
  • Виртуальные функции, полиморфизм, наследование
  • Управление памятью, безопасность исключений
  • Разное: Perfect Forwarding, Auto, Flow Control, Macros

Эти ребята действительно серьезно относятся к своим вопросам, они также составили отличный список вопросов, связанных с С++, которые вы можете задать своим кандидатам: https://tests4geeks.com/cpp-interview-questions/