Хороший тест для встраиваемого инженера
Я расспрашиваю кандидатов в инженеры по встроенному программному обеспечению (в нашей компании мы используем в основном C, иногда C++). Я обычно задаю кандидату немного сложный вопрос. Я не упоминаю, что это может быть решено с небольшим поворотом, когда это не очевидно. Я также принимаю решения без использования битовых операций, но затем направляю кандидата в биты (например, говоря: "Что делать, если вы не можете использовать оператор по модулю"). Пример вопроса может быть:
- проверить, делится ли число на 2 и не делится на 4
- округлить число до следующей степени 2
- считать набор битов в слове
- найти самый старый бит, который установлен в слове
- и т.п.
По моему мнению, такие вопросы должны быть легко решены в течение одной минуты любым достойным инженером-программистом (или даже новым выпускником), независимо от того, в какой области программного обеспечения он работает. Однако мой начальник недавно жалуется, что эти вопросы слишком низкого уровня для тех, кто собирается работать, например, в GUI. Дело дошло до ситуации, когда мои допросы были бесполезны, потому что мой начальник нанял кандидата, который полностью потерпел неудачу в этой теме, но он утверждал, что он имел опыт работы с Qt (я не мог проверить это, поскольку я никогда не использовал Qt, и для по какой-то причине я был единственным, кто мог взять у него интервью в этот момент).
Итак, мой вопрос: немного ли это хороший вопрос для любого (встроенного) разработчика программного обеспечения, или мой начальник прав, и я должен отказаться от того, чтобы задавать его всем кандидатам?
5 ответов
Я думаю, что нужно быть осторожным в том, что вы не спрашиваете, где знание является случайным, независимо от того, есть у собеседника или нет. Для ваших примеров я не могу сразу вспомнить, что такое хиты с переворотами для наиболее значимых битовых вопросов (их поиск и округление до следующей степени 2). Я знаю, что есть взломы, которые я мог бы посмотреть, и я знаю о __builtin_clz
на GCC, который, конечно, не является переносимым.
Итак, провалил ли я интервью? И если это так, вы уверены, что я не приспособлен для программирования Qt в вашей компании? Вы внедряете фильтр, и вам просто нужно подумать о ложноположительном значении (сколько людей будут знать бид-тиддл, но будут плохими сотрудниками) и ложно-отрицательном значении (сколько хороших сотрудников забыли бит-тиддлс),
Конечно, все интервью имеют ложноотрицательный рейтинг. Стоимость найма плохого сотрудника для вашей компании довольно высока, поэтому вы должны быть уверены. По этой причине, я думаю, что если этот сотрудник окажется хорошим, это скорее удача, чем суждение со стороны вашей компании - вам не следует нанимать кого-то, чтобы он был программистом на Qt, не проверив его способности с помощью Qt или чего-то еще аналогичный. Какова стоимость проведения второго собеседования с каждым из трех лучших кандидатов, взятого одним из ваших сотрудников Qt, по сравнению со стоимостью найма лучшего? Сколько стоит ваше время для собеседования с кандидатами, учитывая, что это интервью не влияет на решение о найме?
Просто помните, что разные типы программистов имеют разные знания по их непосредственному командованию, и убедитесь, что ваши вопросы сильно коррелируют с тем типом программистов, который вам нужен. По этому конкретному вопросу доказывается, что собеседник потратил немного времени, возможно, в недавнем прошлом. С другой стороны, это время, которое они потратили на программирование. С другой стороны, это время, которое они не тратили на написание и изучение Qt.
Я был бы обеспокоен, если бы кто-то не знал, как проверить lsb, и не знал, что для положительных значений и для отрицательных значений, дополняющих 2, lsb равен 1 для нечетных чисел и 0 для четных чисел. Это потому, что я ожидаю, что программисты будут знать, что такое двоичное представление. Я также был бы обеспокоен, если бы кто-то думал, что x & 1
скорее всего, будет лучше, чем x % 2
, потому что это означает, что они используют ужасный компилятор;-)
Я не был бы слишком обеспокоен, если бы кто-то не мог вспомнить бид-тиддл для popcount Чуть больше, если они не могли понять код для него после того, как вы дали им тяжелый намек на один из более простых способов сделать это: "Как я мог вычислить попконт из 2-битного целого числа, используя битовое перемешивание? ОК, теперь напишите строку, чтобы сделать это параллельно для каждого из верхних и нижних 2 битов 4-битного целого числа. Хорошо, теперь запишите 32-битный popcount".
Для инженера по встраиваемым технологиям или разработчика программного обеспечения, который должен справиться с разговором с конкретным оборудованием и т. д., эти вопросы хороши. Есть вероятность того, что им придется написать код, который потом будет играть с битами. Не уверен, что это может быть решено в течение ровно 1 минуты, тем более, если рассматриваемый инженер хочет сделать это в общем виде.
Мое мнение таково, что каждый инженер по электронике и / или программному обеспечению должен знать эти вещи. Это основы цифровых вычислений и компьютерного программирования.
Если вы программируете на C, я бы сказал, да. Битовое чередование - это не то, что вы делаете каждый день, а то, что показывает, что вы понимаете, как компьютер обрабатывает ваши данные.
Если вы программируете на языке более высокого уровня, я думаю, это менее важно.
Я думаю, что это зависит от того, над какими встроенными системами они будут работать и что они будут делать с ними; "Встроенный" охватывает очень широкий спектр аппаратного обеспечения. Если им потребуется написать низкоуровневый код или работать с небольшими микроконтроллерами, такие вещи, как переворот, имеют большее значение, чем код более высокого уровня, на чем-то большем, например, SBC-совместимом ПК.
Однако даже при использовании более мощной системы и отсутствии написания низкоуровневого кода все равно важно быть знакомым с побитовыми операциями - по крайней мере, достаточно для обработки битовых флагов и тому подобного (как минимум).