Какой вопрос C ++ лучший? [закрыто]

28

Если бы вы могли задать программисту C ++ один вопрос, чтобы измерить их навыки в C ++, что бы это было?

Вопрос, который я считаю лучшим, звучит так: можете ли вы назвать «удалить это»? внутри функции-члена? (Я поставил это как ссылку, чтобы вы могли сначала обдумать это, а затем перейти к «Лучшему вопросу об интервью C ++ - всегда!», Чтобы увидеть правильный ответ.)

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

Дэвид Тилен
источник

Ответы:

8

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

Добавлено: Функция виртуального члена шаблона в этом ответе означает функцию шаблона, которая является функцией виртуального члена некоторого класса, а не обычной функцией-членом в классе шаблона. Извините за путаницу :(

оборота летнего света
источник
3
@summerlight: я смешиваю функции и шаблоны виртуальных членов, и пока ничего плохого не произошло ... Так что, боюсь, я не понял, к чему вы клоните. Хотите просветить меня :)?
Матье М.
2
Этот ответ почти, но не совсем правильный. У вас не может быть шаблонных виртуальных функций-членов, но вы можете иметь виртуальные функции-члены класса шаблона.
Catphive
1
@Summerlight: ах понял! Забавный вопрос да, часто всплывает;)
Матье М.
2
@nikie: Это виртуальная функция-член в шаблонном классе, а не виртуальная функция-член шаблона, такая как template <typename T> virtual void doSomethingWithGenericTypeT (T arg);
летний свет
2
@summerlight: Вы должны были включить этот пример в свое сообщение. Я понятия не имел, что ты имел в виду до сих пор. Хороший вопрос, хотя, теперь, когда я это понимаю ;-)
nikie
57

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

Стивен Эверс
источник
Согласовано. Не спрашивайте о синтаксисе, который можно найти в Google. Вместо этого попросите кандидата написать простую (хотя и не тривиальную) функцию, предпочтительно то, что вы когда-то написали в своем собственном коде.
Крисайкок
4
Даже что - то же просто , как «написать функцию , чтобы изменить строку» могу сказать вам много о экспертов программиста: они используют CString, char*, std::stringи т.д .; они возвращают новую строку или возвращаются на место; они вручную зацикливаются на символах или они вызывают библиотечную функцию. И, конечно, если они не могут сделать что-то простое, например, перевернуть строку, это также многое о них говорит! Есть также много дополнительных вопросов, например, работает ли он с Unicode, работает ли он с UTF-8 и т. Д.
Gabe
16
@ Эрнелли: C ++ никогда не взлетел? Шутки в сторону?
Стивен Эверс
1
@Gabe - хорошая мысль. Например, выполнение обратного шаблона на месте с параметром политики будет либо не очень общим, либо (скорее, политика, а не функция) довольно сложным, если речь идет о переменных-байтах на символ. Я не знаю, нет ли преждевременной оптимизации (создайте новую строку, потому что это проще для общего характера) или ловкости (не беспокойтесь об этом случае, пока это не произойдет, и обратное изменение на месте не сложнее, может быть, немного проще, для символьных строк фиксированной ширины).
Steve314
1
@Ernelli - вы забыли wchar_t и std :: wstring, и они означают разные вещи в Windows / Unix
Мартин Беккет
32

Я бы спросил их, что им нравится в C ++ 0x. Исходя из этого, я мог «подковать» их в различные стереотипы:

  • супер старая школа, использует компиляторы C ++ для компиляции кода C
  • старая школа, боящаяся (или не видящая смысла) STL, не поспевает за изменениями
  • любит лямбды, любит STL быстрее получать ссылки на rvalue, большой поклонник RAII, горячий использовать shared_ptr, unique_ptr и т. д.
  • горько, потому что весь буст-код, написанный за последние несколько лет, необходимо адаптировать для использования эквивалентов C ++ 0x
  • безумный шаблонный метапрограммист, который заставляет мою голову взорваться, отвечая на относительно короткий вопрос

Скорее всего, некоторые из этих ведер идеально подходят для вас, а некоторые - «спасибо, что пришли». Как вопрос, который быстро дает вам много информации, это мой победитель.

Кейт Грегори
источник
1
+1 за хороший наводящий вопрос, который стимулирует много дискуссий по этому вопросу.
Гари Роу
8
Вы забыли категорию людей, которые понятия не имеют, что такое C ++ 0x. Я думаю, что это будет больше ответа, и будет соответствовать первым двум типам.
Fast Fish
1
@ Fast Fish, да, люди, которые похожи на C ++ 0-что? как правило, будет одной из первых двух категорий, и, как правило, будет освещать это в своем ответе.
Кейт Грегори
28

Я несколько удивлен, почему "вы можете удалить это?" считается интересным вопросом. Любой, кто написал COM-код на C ++, знает, что самое первое, что вы узнаете в первый день базового программирования COM, - это как правильно использовать «delete this». Я полагаю, что было бы полезно определить, скажем, кто-то говорит в своем резюме о написании COM-программ, но в качестве вопроса общего знания C ++, если кто-то не может ответить на него немедленно, тогда он не подойдет для моей команды.

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

Насколько хорошо вы умеете программировать на C ++ в масштабе от одного до десяти?

Это не тот вопрос, который дает вам ответ, который вы хотите. Все говорят «восемь», независимо. Вопрос, который дает вам нужный ответ:

Хорошо, значит, вам восемь. Как вы думаете, с какой проблемой семерке будет трудно работать?

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

Это должно дать вам гораздо лучшую калибровку, чем придумать вопрос по пустякам. Если бы вы заставили меня придумать один хороший вопрос о факте о C ++, я бы, вероятно, спросил что-то вроде: «Как бы вы спроектировали семантический анализатор и генератор кода для той части компилятора C ++, которая работает с виртуальными методами? вызывается в деструкторе базового класса? Вам следует задавать вопросы, связанные с реальными вещами, над которыми вы работаете, и над которыми, вероятнее всего, будет работать кандидат. Это проблема, над которой мне пришлось поработать один раз, и я думаю, что это дало бы довольно хорошее представление о том, как человек разрабатывает семантические анализаторы и генераторы кода, а также свои знания C ++.

Эрик Липперт
источник
3
Я собираюсь начать использовать это: хорошо, так что вам восемь. Как вы думаете, с какой проблемой семерке будет трудно работать?
Дэвид Тилен
10
Еще один хороший вопрос: что может сделать девятка, с которой у вас будут проблемы?
Дэвид Торнли
Это так здорово, это потрясающе.
UpAndAdam
14

Просто для удовольствия, у меня были программисты на C ++, которые шатались с этим маленьким ребенком:

Почему это приводит к бесконечному циклу (и да, он напечатан правильно)?

int x=0;
while (x<3) {
  x = x++;
}

Удивительно, сколько их споткнуло. Конечно, я больше не могу использовать его после того, как он появился в переполнении стека . Бормочет ... бормочет ...

(Чтобы получить правильный ответ, прочитайте признание и обязательно прочитайте комментарии)

Добавлен бонусный вопрос

Существует классическая классическая FizzBuzz (как показано в знаменитой статье Coding Horror ). Я никогда не использовал его на собеседовании, но после того, как однажды пообедал с командой разработчиков, результаты были ... хм ... удивительно точными.

исповедь

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

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

Гэри Роу
источник
1
Гари Роу: Хотя мне нравится этот пример (я впервые его увидел). Меня огорчает, что люди не видят этого достаточно быстро, не говоря уже о том, чтобы не знать.
Orbling 12.12.10
2
Когда я работал в Microsoft, я начал просить кандидатов внести вклад в связанный список. Зачем? Потому что около 80% не могли этого сделать. Удивительно ...
Дэвид Тилен
43
Это не обязательно бесконечный цикл. Вы вызываете неопределенное поведение здесь (x изменяется дважды без промежуточной точки последовательности). И на самом деле, с моим конкретным компилятором gcc (Debian 4.3.2-1.1) 4.3.2 на моей конкретной арке (x86) он действительно завершается.
Логан Капальдо
2
@Logan +1 за упоминание точек последовательности. Вы получите второе интервью наверняка ;-)
Гари Роу
4
Это действительно хороший вопрос для собеседования, потому что он говорит кандидату, стоит ли возвращаться на другое собеседование ;-). Если собеседование действительно думает, что код действительно приводит к бесконечному циклу (а интервьюер должен быть технически компетентным), тогда кандидат может смело дать «возможность» пропустить.
CB Bailey
8

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

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

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

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

SBI
источник
7

Расскажите мне о конструкторе копирования.

fredoverflow
источник
2
+1. Тот отсеивает некомпетентных кандидатов за пять секунд.
Неманя Трифунович
6

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

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

Orbling
источник
6

Лучший вопрос для великого разработчика C ++: «Скажите мне, почему мы НЕ должны использовать C ++?»

amadvance
источник
4

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

sashang
источник
3

Мой любимый вопрос прост:

а) Вы начали с C, а затем переключились на C ++?

б) Если да, то какие первые вещи вы научились делать по-другому?

Этот ответ обычно дает мне представление о том, как программист подходит к С ++, и в целом понимает ООП и С ++.

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

mohaps
источник
1

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

Смысл этого не в том, чтобы определить свои знания C ++, а в том, насколько хорошо они понимают программирование. Когда вы понимаете основные принципы программирования, вы можете решать проблемы.

Павел
источник
1

Как вы реализуете виртуальные функции в C ++, объясните сценарий реального мира.

user616
источник
1

В данный момент я бы сказал: «Как бы вы реализовали конструктор перемещения для контейнера?»

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

Каз Дракон
источник
1

Я думаю , я бы спросить их мнение о дизайне, скажем, std::string. Я бы также спросить их , если они использовали другие конструкции (например, MFC / ATL CString, wxStringи т.д.) и при условии , что они имеют, попросите их сравнить и сопоставить конструкции.

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

Джерри Гроб
источник