Здравствуйте, Vzhyk, Вы писали:
V>Я не так давно ради прикола сходил посмотреть на современное V>собеседование (программирую на С и С++ уже 20 лет). Так вот на V>простейший вопрос, то что я постоянно использую в повседневном V>программинге не задумываясь уже лет 10, но поставленный в абстрактной V>форме на собеседовании я ответить не смог.
if, switch, функции, классы — не? или в чем вопрос-то?
V>Собеседования, подобные описанным выше фактически отбирают тех, кто V>недавно прочитал книжки по языку и разобрался в них и все эта теория еще V>не выветрилась.
Ну хз, вопросы вроде как тривиальные. И вполне жизненные. Я чтобы их сформулировать, в книжку не лез. Просто взял несколько тем по памяти...
А чего спрашивать? Про круглые люки и гномиков — какой-то маразм. Вообще не спрашивать про язык? Ну дык ты ж на нем пишешь, тривиальные вещи должен знать.
31.08.2012 12:39, enji пишет:
> Поддержки имеющихся проектов, их улучшения, работы над новыми. > > Собственно чем мой ответ тебе помог? имхо, все хотят от сотрудников > примерно такого....
Мне ничем, ты же совета спрашиваешь. А твой ответ говорит только о том,
что ты не знаешь, что именно тебе нужно от нового сотрудника. А пример
применения такого подхода вот: http://rsdn.ru/forum/message/4870693.aspx
Здравствуйте, Vzhyk, Вы писали:
V>А твой ответ говорит только о том, V>что ты не знаешь, что именно тебе нужно от нового сотрудника.
Гм, сильное заявление. А что по твоему ответит тот, кто знает об этом?
V> А пример V>применения такого подхода вот: http://rsdn.ru/forum/message/4870693.aspx
Тему проглядел, к чему ты на нее ссылаешься — не понял. Наняли чуваков, которые пахали на испытательном, а потом обленились? Поговорить, если не работает — уволить. Проблем не вижу...
31.08.2012 12:41, enji пишет:
> Ну вестимо нашей фирме и нашим задачам.
Адекватным вашим задачам — это перл.
> Я вот пока не понял, в чем смысл твоих вопросов?
В том, чтобы ты сначала осознал четко, какие именно требования ты
предъявляешь к новому сотруднику, а затем уже выяснял, удовлетворяют ли
соискатели твоим требованиям ну и также осознавал, насколько твои
требования соответсвуют вашей деятельности. Главное, что требования ты
должен (себе) сформулировать точно и четко и так, чтобы их можно было
проверить.
Здравствуйте, Vzhyk, Вы писали:
>> Я вот пока не понял, в чем смысл твоих вопросов? V>В том, чтобы ты сначала осознал четко, какие именно требования ты V>предъявляешь к новому сотруднику, а затем уже выяснял, удовлетворяют ли V>соискатели твоим требованиям ну и также осознавал, насколько твои V>требования соответсвуют вашей деятельности. Главное, что требования ты V>должен (себе) сформулировать точно и четко и так, чтобы их можно было V>проверить.
О великий гуру! Расскажи же мне, чем плохи мои требования?
На всякий случай их тут повторяю:
— знание С, C++ — обязательно
приветствуются
— опыт работы
— знание наших процессоров
— умение читать принципиальные схемы
— знания в нашей прикладной области
Собеседование ставит своей целью проверить пункт номер 1 и выяснить, что получается по остальным пунктам. Пункты 1 и 2 важны, поэтому хочется посмотреть на код, который выдает соискатель.
31.08.2012 12:46, enji пишет:
>или в чем вопрос-то?
Это не вопрос. Это так пример к сведению.
> А чего спрашивать? Про круглые люки и гномиков — какой-то маразм. Вообще > не спрашивать про язык? Ну дык ты ж на нем пишешь, тривиальные вещи > должен знать.
Ну когда я ищу человека, я ищу в первую очередь того, кто будет работать
и изучать то, что нужно по дальнейшей работе. Для этого беседа о его
прошлой работе, что именно он делал и как, как решал различные
сложности. В общем беседа. А вот непосредственно С, C++, если есть 2-3
года коммерческого программирования мне достаточно. Если у меня есть
неуверенность в его опыте С++, предлагаю набросать класс vector, как он
его видит.
Да, для те, у кого опыта меньше 2 лет, тест на дом.
Здравствуйте, Vzhyk, Вы писали:
V>Ну когда я ищу человека, я ищу в первую очередь того, кто будет работать V>и изучать то, что нужно по дальнейшей работе. Для этого беседа о его V>прошлой работе, что именно он делал и как, как решал различные V>сложности. В общем беседа.
Ок, ясно, спасибо.
V>А вот непосредственно С, C++, если есть 2-3 V>года коммерческого программирования мне достаточно.
Вот тут не согласен. Был у нас чувак, который несколько лет писал вполне себе коммерческий код. Но как потом внезапно оказалось после его увольнения — совершенно не поддерживаемую копи-пасту.
Так что на код хотелось бы посмотреть, даже с 3 годами опыта...
E>Несколько простых вопросов на знание языка (~15-20 мин):
В виде кода, но не энциклопедических знаний. Это обязательно. Собственно это и есть самое главное. Ну кроме личных качеств.
E>- напишите функцию реверса строки E>- чему равен размер struct {int a; char c;} E>- зачем нужен volatile E>-
В таком виде лучше не надо. Разве что для проверки тех самых личных качеств. Хорошему программеру надо задавать вопрос с челленджем. Пусть маленьким, но челленджем. К тому же все мужики независимо от возраста дети, и любят играть и соревноваться.
E>- Есть устройство, у которого могут быть разные каналы передачи данных (посл порт, tcp, twi, ...) и разные протоколы (отличаются форматом пакетов). Как бы вы спроектировали программу для него?
От это уже неплохо. Но стоит добавить изюминку. Просто что бы была точка опоры и какая-то сложность.
E>Дать "домашнее задание" по теме работы (~2-4 часа). К примеру: "Вот описание протокола управления устройством. Напишите программу, которая принимает стандартный ввод, выделяет из него команды и отвечает на них в стандартный вывод. Пока требуется реализовать поддержку только указанных команд (скажем, 4 или 5). Предусмотрите возможность добавления новых команд."
Бессмысленно. Лучше просить показать собственные наработки. Или просто любимые приёмы. Вам нужен человек который за всю свою карьеру ничего под себя не создал?!
E>И оценить как работу проги (написать простой автотестер, который скормит кривые пакеты, случайный мусор, а также правильные команды и посмотрит на ответы), так и исходный код, наличие тестов, сборочного скрипта, репозитария dvcs
От это тоже хорошо. Здесь с одной стороны есть фактура с которой работать и человеку проще начать, с другой умение читать и понимать, даже важнее умения писать. Написать то может любой, а вот прочитать, понять, и переделать с учётом изменившихся требований — далеко не каждый.
> Гм, сильное заявление. А что по твоему ответит тот, кто знает об этом?
Твои требования должны быть четко сформулированы тобой и проверяемы.
А не хочу сказать, что это плохо, проверять знания, если именно это ваши
требования и именно это вам и нужно.
То есть фактически. Твое требование (по первому посту): "Нам нужны
программисты с такими-то знаниями и не более" — и это ты и проверяешь.
Нюанс в том, что именно такое требование чрезвычайная редкость и даже с
твоим нечетким высказыванием выше это требование слабо согласуется.
> Тему проглядел, к чему ты на нее ссылаешься — не понял. Наняли чуваков, > которые пахали на испытательном, а потом обленились? Поговорить, если не > работает — уволить. Проблем не вижу...
У ТС большие проблемы с этим. Как понятно было из обсуждения — у них
такая ситуация типична.
31.08.2012 13:05, enji пишет:
> На всякий случай их тут повторяю: > — знание С, C++ — обязательно
Тогда полноценный экзамен самое логичное и правильное.
Но будут ли эти люди работать? Фактически основной вопрос, который ты
боишься поставить, но именно ответ на него тебе и нужен, вероятнее
всего. (немножко потелепал)
Здравствуйте, Vzhyk, Вы писали:
V>31.08.2012 13:05, enji пишет:
>> На всякий случай их тут повторяю: >> — знание С, C++ — обязательно V>Тогда полноценный экзамен самое логичное и правильное.
ИМХО, ты передергиваешь — вопросы из первого поста не являются экзаменом на С++. Просто несколько вопросов, чтобы оценить знания кандидата.
V>Но будут ли эти люди работать? Фактически основной вопрос, который ты V>боишься поставить, но именно ответ на него тебе и нужен, вероятнее V>всего. (немножко потелепал)
Оно то конечно так, но брать человека, который будет работать, но не знает С/С++ — как то страшновато. Сможет ли он освоить язык за разумный срок? Хз.
Брать человека, который язык знает, но генерит жуткий код — тож не охота. Если он уволится — мне же за ним подтирать. Отсюда идея про тестовое задание/открытый проект.
Будет ли работать тот, кто знает язык и нормально пишет — ну тоже хз. Однако если он "адекватен" — то будет, иначе накой он пришел на собеседование?
31.08.2012 13:14, enji пишет:
> V>А вот непосредственно С, C++, если есть 2-3 > V>года коммерческого программирования мне достаточно. > Вот тут не согласен. Был у нас чувак, который несколько лет писал вполне > себе коммерческий код. Но как потом внезапно оказалось после его > увольнения — совершенно не поддерживаемую копи-пасту.
Не понимаю, как такое может быть? Так или иначе код любого программиста
известен его начальнику. Либо человек пишет код так, как у нас принято,
либо увольняется.
Понятно, что каждый человек пишет код со своими особенностями, но проект
всегда разбит на модули, а модули на более мелкие модули, все модули
покрыты тестами. В итоге, если какой молодой наваял какую фигню в
течение 1 месяца (чаще все видно уже за 1-2 недели), достаточно
безболезненно все починить.
Как пример, один очень серьезный проект, был сделан фактически силами
студентов и двух "старичков", проект уже живет 7 лет и развивается и не
собирается умирать.
> Так что на код хотелось бы посмотреть, даже с 3 годами опыта...
"Обжегшись на молоке..."
31.08.2012 13:18, Alexéy Sudachén пишет:
> От это уже неплохо. Но стоит добавить изюминку. Просто что бы была точка > опоры и какая-то сложность.
По мне и так нормально, но нужно больше детализации в постановке задачи,
а то тянет на вариант: "угадайте, что мы хотим".
> Бессмысленно. Лучше просить показать собственные наработки. Или просто > любимые приёмы. Вам нужен человек который за всю свою карьеру ничего под > себя не создал?!
Только желательно предупреждать человека заранее об этом и в стиле дать
возможность человеку похвастаться.
Здравствуйте, Vzhyk, Вы писали:
V>Не понимаю, как такое может быть? Так или иначе код любого программиста V>известен его начальнику. Либо человек пишет код так, как у нас принято, V>либо увольняется.
Ну как тебе сказать. В идеале ты прав. Однако народа у нас в то время было мало, начальник был вообще не программистом и интересовала его функциональность, а не код.
В результате мы имеем:
V>Понятно, что каждый человек пишет код со своими особенностями, но проект V>всегда разбит на модули, а модули на более мелкие модули, все модули V>покрыты тестами.
Опять таки, в идеале ты прав. Я тож так считаю и потихоньку мы движемся в этом направлении. Но даже сейчас мы далеки от светлого будущего
>> Так что на код хотелось бы посмотреть, даже с 3 годами опыта... V>"Обжегшись на молоке..."
Возможно, но как еще определить? Брать и изгонять через месяц — имхо хуже...
Здравствуйте, enji, Вы писали:
E>- напишите функцию реверса строки
std::reverse.
если кандидат может ответить на остальные вопросы — строку он как-то развернет наверное
E>- чему равен размер struct {int a; char c;}
sizeof(T)
E>- зачем нужен volatile
хороший вопрос. очевидно затем чтобы передать переменную библиотечным функциям которые требуют volatile аргументы
или Вы про volatile у методов? даже хз
E>*(unsigned*)(buf+5)=123456;
вы уже уволили того кто так написал?
E>- #define MAX(a,b) — как написать, чем чревато?
макросы вместо функций? никак не писать.
E>- как написать шаблонную функцию max? Что она должна возвращать?
decltype(a > b ? a : b) , что же еще?
E>
E>//a.cpp:
E>struct S{ string a; int b; } sa;
E>//b.cpp:
E>struct S{ int b; string a; } sb;
E>
E>чем чревато? Как обойти?
тут только одна проблема — using namespace std;
E>- зачем нужен виртуальный деструктор? Как обойтись без него в случае, когда надо удалить объект, не зная его точного типа?
действительно хорошй вопрос. тут можно о многом поговорить (типа интерфейсы vs абстрактные классы)
E>- Есть устройство, у которого могут быть разные каналы передачи данных (посл порт, tcp, twi, ...) и разные протоколы (отличаются форматом пакетов). Как бы вы спроектировали программу для него?
какую программу? `int main() {}` за программу считается?
общем эти вопросы вызывот только недоумение со стороны адекватных кандидатов
E>Дать "домашнее задание" по теме работы (~2-4 часа). К примеру: "Вот описание протокола управления устройством. Напишите программу, которая принимает стандартный ввод, выделяет из него команды и отвечает на них в стандартный вывод. Пока требуется реализовать поддержку только указанных команд (скажем, 4 или 5). Предусмотрите возможность добавления новых команд."
непонятно что можно оценить по программе в 200 строк.
задачу в такой постановке можно решить сотней способов, и многие из них субъективно покажутся "неправильными" — "много Си"/"много С++"/"выглядит как Java"
"возможность добавления новых команд" — это плохое условие, не указано сколько будет команд и насколько они сложные, в зависимости от этого решение может быть очень разным.
E>И оценить как работу проги (написать простой автотестер, который скормит кривые пакеты, случайный мусор, а также правильные команды и посмотрит на ответы), так и исходный код, наличие тестов,
всмысле "написать простой автотестер"? есть же готовые фреймворки
E>сборочного скрипта,
чего-чего? .sln чтоли? E>репозитария dvcs
для задачи которая делается за 1 коммит (1 час), репозиторий не нужен
Здравствуйте, Abyx, Вы писали:
A>если кандидат может ответить на остальные вопросы — строку он как-то развернет наверное
ок, выкидаем
E>>- чему равен размер struct {int a; char c;} A>sizeof(T)
встречный вопрос кандидату, чему будет равен этот sizeof, от чего это зависит.
E>>- зачем нужен volatile A>хороший вопрос. очевидно затем чтобы передать переменную библиотечным функциям которые требуют volatile аргументы
Странный ответ. Но если ответит так — спрошу про ввод\вывод или многопоточность...
E>>*(unsigned*)(buf+5)=123456; A>вы уже уволили того кто так написал?
встречный вопрос — почему его надо уволить?
E>>- #define MAX(a,b) — как написать, чем чревато? A>макросы вместо функций? никак не писать.
встречный вопрос — а если очень надо? Нет constexpr скажем...
E>>- как написать шаблонную функцию max? Что она должна возвращать? A>decltype(a > b ? a : b) , что же еще?
встречный вопрос — а если нет с++11?
A>тут только одна проблема — using namespace std;
на самом деле нет — нарушено ODR — будет ub и скорее всего вылет в дебаге...
E>>- Есть устройство, у которого могут быть разные каналы передачи данных (посл порт, tcp, twi, ...) и разные протоколы (отличаются форматом пакетов). Как бы вы спроектировали программу для него? A>какую программу? `int main() {}` за программу считается?
встречный вопрос — да, но когда ты научишь программу принимать команды — как сделать заменяемость каналов и протоколов7
A>общем эти вопросы вызывот только недоумение со стороны адекватных кандидатов
Ок, предложи более лучшие
A>непонятно что можно оценить по программе в 200 строк.
Ну например корректность ее работы. Подозреваю что там будет не 200 строк, а побольше все ж таки A>задачу в такой постановке можно решить сотней способов, и многие из них субъективно покажутся "неправильными" — "много Си"/"много С++"/"выглядит как Java"
Да фиг с ним — главное чтобы она работала, была понятна окружающим и позволяла легко расширить себя. A>"возможность добавления новых команд" — это плохое условие, не указано сколько будет команд и насколько они сложные, в зависимости от этого решение может быть очень разным.
А как иначе? Вот мне говорят — сделай такую-то функциональность. И все. Но завтра могут прийти и сказать сделать еще что-то. Я что скажу — идите лесом, вы вчера дали мне неверное задание? Приходится включать телепалку...
E>>И оценить как работу проги (написать простой автотестер, который скормит кривые пакеты, случайный мусор, а также правильные команды и посмотрит на ответы), так и исходный код, наличие тестов, A>всмысле "написать простой автотестер"? есть же готовые фреймворки
Для чего? Чтоб сравнить два файла?
E>>репозитария dvcs A>для задачи которая делается за 1 коммит (1 час), репозиторий не нужен
Я ж намекнул про расширение. Не нужен — ну поговорим, почему не нужен...
Про прошлые вопросы я уже все сказал, да и тут не раз уже их перетирали.
> Однако если он "адекватен" — то будет, иначе накой он пришел на > собеседование?
Да на вас посмотреть.
Здравствуйте, enji, Вы писали:
E>>>- чему равен размер struct {int a; char c;} A>>sizeof(T) E>встречный вопрос кандидату, чему будет равен этот sizeof, от чего это зависит.
тогда лучше сразу спросить от чего зависит,
или *как рассчитывается* — max(sizeof(int), default_align) + default_align (хотя хз чем это знать IRL)
E>>>- зачем нужен volatile A>>хороший вопрос. очевидно затем чтобы передать переменную библиотечным функциям которые требуют volatile аргументы E>Странный ответ. Но если ответит так — спрошу про ввод\вывод или многопоточность...
для атомарности — есть <atomic>,
а volatile, это так, вспомогательное средство чтоб гарантировать что в памяти всегда лежит самое свежее значение переменной, при помощи которого можно написать atomic типы
E>>>*(unsigned*)(buf+5)=123456; A>>вы уже уволили того кто так написал? E>встречный вопрос — почему его надо уволить?
за char[] и магическое число 5 вместо структуры с читабельным названием и именами полей
E>>>- #define MAX(a,b) — как написать, чем чревато? A>>макросы вместо функций? никак не писать. E>встречный вопрос — а если очень надо? Нет constexpr скажем...
очень надо бывает так редко, что можно и ?: обойтись
E>>>- как написать шаблонную функцию max? Что она должна возвращать? A>>decltype(a > b ? a : b) , что же еще? E>встречный вопрос — а если нет с++11?
а это звоночек
впрочем "Что она должна возвращать" зависит от того что мы хотим чтобы она возвращала.
это религиозный вопрос — разрешать возврат T& или ограничиться только const T& (ну и volatile не забыть)
хотя обсуждение религиозных вопросов это хорошо, потом не будете сожалеть что коллега пишет x.get() = 42;
A>>тут только одна проблема — using namespace std; E>на самом деле нет — нарушено ODR — будет ub и скорее всего вылет в дебаге...
да, действительно, там же нетривиальный конструктор/деструктор
E>>>- Есть устройство, у которого могут быть разные каналы передачи данных (посл порт, tcp, twi, ...) и разные протоколы (отличаются форматом пакетов). Как бы вы спроектировали программу для него? A>>какую программу? `int main() {}` за программу считается? E>встречный вопрос — да, но когда ты научишь программу принимать команды — как сделать заменяемость каналов и протоколов7
т.е. вопрос в том как спроектировать фреймворк для передачи данных по разным протоколам? ответ сильно зависит от структуры пакетов и требований по производительности.
это может быть либо AbstractDeviceFacade+AbstractXXXFacade с виртальными методами на каждый пакет, либо свободные функции и структуры на каждый пакет — вариантов много
A>>"возможность добавления новых команд" — это плохое условие, не указано сколько будет команд и насколько они сложные, в зависимости от этого решение может быть очень разным. E>А как иначе? Вот мне говорят — сделай такую-то функциональность. И все. Но завтра могут прийти и сказать сделать еще что-то.
однако обычно говорят что это либо "сейчас поддержать 5 пакетов, а завтра еще 500", или "сейчас 5 пакетов, а потом по 1-2 в месяц"
расширять можно по-разному
E>>>И оценить как работу проги (написать простой автотестер, который скормит кривые пакеты, случайный мусор, а также правильные команды и посмотрит на ответы), так и исходный код, наличие тестов, A>>всмысле "написать простой автотестер"? есть же готовые фреймворки E>Для чего? Чтоб сравнить два файла?
если у программы есть состояние, 1 большого теста мало, надо делать кучу тестов и в каждом сбрасывать состояние,
а то может получиться что программа работает только на одной начальной последовательности пакетов
A>>общем эти вопросы вызывот только недоумение со стороны адекватных кандидатов E>Ок, предложи более лучшие
я бы вообще не задавал вопросов, а дал бы несколько больших кусков какогонить опенсорсного кода, и сказал бы сделать им "ревью" — рассказать что в этом коде хорошо, а что плохо
Здравствуйте, SkyDance, Вы писали:
SD>Вы сами можете ответить на эти вопросы? Особенно на последний. Нет, я не про теорию, а про практику. Вы действительно хотите углубиться в обсуждение архитектур CPU, в понимание барьеров? Как мне кажется, лучше все-таки заменить этот вопрос на что-нибудь о sequence points, c какими-нибудь if (++count == 100).
не относящийся к теме вопрос. Какое отношение в c/c++ volatile имеет к барьерам? Оно же, вроде как, просто оптимизации на уровне компилятора запрещает? Спрашиваю, потому, что реально не знаю и интересно, что знающие люди скажут.