Яке найкраще питання інтерв'ю на C ++? [зачинено]


28

Якщо ви могли б задати програмісту C ++ одне запитання, щоб виміряти свої C ++ навички, що це було б?

Питання, яке я вважаю найкращим, таке: чи можете ви зателефонувати "видалити це;" всередині функції члена? (Я ставлю це як посилання, щоб ви могли продумати його спочатку, а потім перейдіть до The Best C ++ Question Question - Ever !, щоб побачити правильну відповідь.)

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

Відповіді:


8

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

Додано: Функція віртуального члена шаблону в цій відповіді означає функцію шаблону, яка є функцією віртуального члена певного класу - не звичайною функцією члена в класі шаблонів. Вибачте за плутанину :(


3
@summerlight: Я змішую функції та шаблони віртуальних членів, і поки нічого поганого не сталося ... Тож боюся, я не зрозумів, до чого ти потрапляєш. Хочете мене просвітити :)?
Матьє М.

2
Ця відповідь майже, але не зовсім правильна. Ви не можете мати віртуальних функцій віртуальних членів, але ви можете мати функції віртуальних членів класу шаблонів.
сом

1
@summerlight: ах це зрозуміло! Кумедне запитання так, часто спливає;)
Матьє М.

2
@nikie: Це функція віртуального члена в класі шаблонів, а не функція члена віртуального шаблону, як шаблон <typename T> virtual void doSomethingWithGenericTypeT (T arg);
літнє світло

2
@summerlight: ти повинен був включити цей приклад у свою посаду. Я до цього часу не мав уявлення, що ти маєш на увазі. Хороше запитання, але тепер, коли я це розумію ;-)
nikie

57

Найкращим питанням інтерв'ю на C ++ була б проблема програмування, а не питання вікторини.


Домовились. Не запитуйте про синтаксис, який можна шукати в Google. Натомість запропонуйте кандидату написати просту (хоча і не тривіальну) функцію, бажано щось, що ви написали у власному коді в один момент.
chrisaycock

4
Навіть що - то ж просто , як «написати функцію , щоб змінити рядок» можу сказати вам багато про експертів програміста: вони використовують CString, char*, std::stringі т.д.; повертають вони нову рядок чи зворотно на місце; вони вручну перебирають символи чи викликають функцію бібліотеки. І звичайно, якщо вони не можуть зробити щось просте, наприклад, зворотний рядок, це також багато що говорить про них! Також є багато запитань, що стосуються, як це працює з Unicode, чи працює з UTF-8 тощо.
Гейб

16
@Ernelli: C ++ ніколи насправді не знімав? Серйозно?
Стівен Еверс

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

1
@Ernelli - ви забудете wchar_t та std :: wstring та їх значення, що означають різні речі в Windows / Unix
Martin Beckett

32

Я б запитав їх, що їм подобається в C ++ 0x. З цього я міг би їх "відробити" до різних стереотипів:

  • супер стара школа, використовує компілятори C ++ для складання коду С
  • стара школа, злякана (або не бачить сенсу) STL, не відставала від змін
  • любить лямбдаш, любить STL, отримуючи швидше від посилань на рейтинги, великий вентилятор RAII, гарячий у використанні shared_ptr, unique_ptr тощо
  • гірко, тому що весь прискорений код, написаний протягом останніх кількох років, потрібно буде адаптувати для використання C ++ 0x еквівалентів
  • божевільний метапрограмер шаблону, який змушує мою голову вибухнути, відповідаючи на порівняно коротке запитання

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


1
+1 за гарне головне запитання, яке заохочує багато дискусій навколо теми.
Гері Роу

8
Ви забули категорію людей, які поняття не мають, що це C ++ 0x. Я думаю, що це було б більше відповіді і відповідатиме першим двом типам.
Швидка риба

1
@Fast Fish, так, люди, схожі на C ++ 0-whatnow? як правило, буде однією з перших двох категорій, і зазвичай висвітлює це у своїй відповіді.
Кейт Григорій

28

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

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

На шкалі від одного до десяти, наскільки хороший програміст на C ++?

Це не питання, яке отримує від вас потрібну відповідь. Усі говорять "вісімки" незалежно. Питання, яке дає вам відповідь, яку ви хочете:

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

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

Це повинно дати вам набагато кращу калібрування, ніж придумати якісь дрібниці. Якби ви змусили мене створити хороший єдиний запитання про факт про C ++, я, мабуть, запитав би щось на кшталт "як би ви створили семантичний аналізатор та генератор коду для частини компілятора C ++, що займається віртуальними методами викликається деструктором базового класу? " Вам слід задати питання, які стосуються справжніх речей, над якими ви працюєте, і над якими кандидат, швидше за все, працюватиме. Це проблема, над якою мені довелося попрацювати один раз, і я думаю, що це дасть досить гарне уявлення про те, як людина розробляє семантичні аналізатори та генератори коду, а також свої знання C ++.


3
Я почну використовувати це: Добре, значить, вам вісім. Яка проблемна область, з якою, на вашу думку, семерою буде важко працювати?
Девід Тілен

10
Ще одне хороше запитання тут: що дев’ять може зробити, з чим у вас виникнуть проблеми?
Девід Торнлі

Це так чудово, що це дивовижно.
UpAndAdam

14

Просто для задоволення, у мене були програмісти на C ++, котрі бавляться з цією маленькою дитиною:

Чому це стикається з нескінченним циклом (і так, це правильно введено)?

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

Дивно, скільки потрапляють на сполох. Звичайно, я більше не можу його використовувати після появи на Stack Overflow . Буркот ... бурмотання ...

(Щоб отримати правильну відповідь, прочитайте сповідь та обов'язково прочитайте коментарі)

Додано питання про бонус

Існує класичний FizzBuzz, який міститься в часі (як це показано у відомій статті Coding Horror ). Я ніколи насправді не використовував це в інтерв'ю, але після того, як зафіксував його навколо команди розробки в один обідній час, результати були ... гм ... напрочуд точними.

Сповідь

Мене спіймало стандартна відповідь "x ++ повертає початкове значення". Однак правильна відповідь полягає в тому, що поведінка не визначена через точки послідовності. Ніхто ніколи не згадував точки послідовності в усі часи, коли я цим користувався, поки не розмістив його тут.

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


1
Гері Роу: Хоча я люблю цей приклад (вперше я його бачив). Мене сумно, що люди не бачать цього досить швидко, не кажучи вже про те, що не знають.
Увімкнення

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взагалі.)

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



6

Я вважаю, я б запитав у них, що вони ще знають, або, швидше за все, дав би їм питання в чомусь зовсім іншому.

Занадто багато кодерів на C ++ про тих, хто не має досвіду інших мов. Вузький досвід, як правило, обмежувальний.


6

Найкраще питання для чудового розробника C ++ - це "Скажіть мені причини, чому ми НЕ повинні використовувати C ++?"


4

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



3

Моє улюблене запитання - це просте:

а) Ви почали з C, а потім перейшли до C ++?

б) Якщо так, то які перші перші речі ви навчились робити інакше?

Ця відповідь, як правило, дає мені грамоту щодо того, як програміст підходить до C ++ та його / її розуміння OOP та C ++ взагалі.

тут немає відповіді "Правильно" або "Неправильно", але зазвичай це прекрасний спосіб зрозуміти, звідки приходить кандидат.


1

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

Сенс цього не в тому, щоб визначити їх знання C ++, а з’ясувати, наскільки вони добре розуміють програмування. Коли ви розумієте основні поняття, що стоять за програмуванням, тоді ви можете вирішити проблеми.


1

Як ви реалізуєте віртуальні функції в C ++, поясніть сценарій реального світу.


1

На даний момент я б сказав: "Як би ви почали впроваджувати конструктор переміщення для контейнера?"

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


1

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.