Помогите составить С++ тест/покритикуйте идею

Julia79

С целью отбора кандидатов на интервью, мы решили составить С++ тест который должен отсеять явно неквалифицированных кандидатов, и в идеале отобрать талантливых кандидатов.
Тебования к тесту следущие:
1. 30 минут на выполнение, высылается по емайл в удобное для кандидата время, ответ - тоже по емайл.
2. 4 вопроса - 2 очень простых на базовые знания С++ (10 минут на оба для квалифицированного программиста 2 - посложнее, по 20 минут на каждый (тест формируется так чтобы большинство людей не могли его закончить - поможет выявить гениальных программистов).
3. Тест должен проверить качество кода кандидата и его образ мышления, для его выполнения не дожно быть нужно никаких специальных знаний - только С++ в рамках stl и стандарта.
Собственно, я хотел обратится к доброфоруму с просьбой о помощи сгенерировать эти самые 4 вопроса, и услышать мнение об идее в целом.
Пока есть 1 вопрос (из категории легкие):
Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
Если удастся составить удачный тест, буду не против если другие форумчане будут им пользоваться - мне кажется эта идея может помочь существенно сократить время на интервью и позволит отобрать стоящих кандидатов для беседы.

zorin29

inputString="aaaa",before="aaa",after="abc" -> ?

Julia79

inputString="aaaa",before="aaa",after="abc" -> ?
abca
Хороший вопрос - первое найденное before нужно заменить на after.

lubanj

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

Whoman-in-white

мы решили составить С++ тест который должен отобрать талантливых кандидатов.
30 минут на выполнение

что-то не сходится

Whoman-in-white

Пока есть 1 вопрос (из категории легкие):
Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
по мне так если это раньше не писал, то одно это задание минут 30 займет, чтобы по-нормальному реализовать

Julia79

В ответ на:
мы решили составить С++ тест который должен отобрать талантливых кандидатов.
 
В ответ на:
30 минут на выполнение
что-то не сходится
А на сколько тогда давать тест? Если сделать сильно длинный, может отпугнуть многих людей - т.к. этот тест будут заполнять все кто присылают резюме перед интервью, нельзя отнимать у людей много времени даже не поговорив с ними о работе.
И он только чтобы отсеять неквалифицированных людей и не тратить на них время на интервью, (результат теста - да/нет, и ДА+ чтобы отметить особо талантливых). Окончательное решение в любом случае по итогам интервью.
Насчет вопроса согласен, он в категорию посложнее наверное...

Julia79

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

Julia79

По результатам комментариев, вот первая незаконченная версия:
Тест 1.0:
1. Напишите оператор < для класса
 
 template <class T1, class T2, class T3>
class Triplet
{
public:
T1 first;
T2 second;
T3 third;
};

Сравнивает first для двух елементов, в случае равенства сравнивает second, в случае равенства сравнивает third.
2. ------
3. Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
inputString="aaaa",before="aaa",after="abc" -> "abca"
4. Что-то про бинарный поиск/деревья.

istran

А стандартные библиотечные функции можно использовать (sting::find)? Если да, то действительно задача на 5 минут. Если нет, то надо реализовывать КМП, а это уже побольше времени займет.

Whoman-in-white

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

Julia79

Да, можно, я бы даже сказал нужно. На вопрос про строки ожидается ответ типа такого (без main, только сама repalceAll):
 
  
#include <iostream>
#include <string>
#include <vector>

void replaceAll(std::string &inputString, const std::string &before, const std::string &after)
{
auto pos = inputString.find(before);
while(pos != std::string::npos)
{
inputString.replace(pos,before.sizeafter);
pos = inputString.find(before,pos+after.size-before.size+1);
}
}

int main
{
const size_t NUM_INPUTS = 4;
std::vector<std::string> inputStrings(NUM_INPUTSbefore(NUM_INPUTSafter(NUM_INPUTS);
inputStrings[0] = "Test test test";before[0] = "te";after[0]="ab";
inputStrings[1] = "aaaa";before[1] = "a";after[1]="aa";
inputStrings[2] = "aaaa";before[2] = "aaa";after[2]="abc";
inputStrings[3] = "";before[3] = "a";after[3]="b";
for(size_t i=0;i<inputStrings.size;++i)
{
std::cout << "[" << inputStrings[i].c_str
<< "," << before[i].c_str << "," << after[i].c_str << "] -> ";
replaceAll(inputStrings[i],before[i],after[i]);
std::cout << inputStrings[i].c_str << std::endl;
}
return 0;
}

Нужно ещё 3-4 вопроса такого типа - проверяющих знания и стиль программирования, с коротким решением, чтобы написание ответа у квалифицированного человека занимало меньше времени чем поиск ответа в гугле.

bleyman

(тест формируется так чтобы большинство людей не могли его закончить - поможет выявить гениальных программистов).
Он вам поможет выявить быстро-печатающих программистов. К "гениальности" или вообще пригодности для работы над большим проектом, особенно в команде, результаты теста не будут иметь ни малейшего отношения.
Я бы посоветовал реструктурировать ваш подход в целом.
1. Мелкие но нетривиальные задачки с таймлимитом помогут отсечь не-программистов которые попытаются спросить стековерфлоу. Идея в формулировке таких задачек — что решение не должно находиться гуглом вообще, так что им реально придётся спрашивать и ждать ответа.
replaceAll дико плохая задачка в этом смысле, спросите лучше что-нибудь дичайше специализированное, ну, я не знаю, дана строка вида "key1=value1, key2=value2, ...", заполнить из неё map. Допустимость пробелов в неожиданных местах, пустых элементов, етс — по вкусу.
Или что-нибудь ещё более специализированное, типа, у нас есть логи в хитровывернутом формате из херни разделённой "|", написать прогу которая выводит строки содержащие только WARNING или ERROR в третьем по счёту поле, от процесса с номером данным в argv, который содержится в пятом поле.
Короче, любой достаточно нетривиальный one-liner на перле или питоне покатит как просьба сделать что-то достаточно геморойное в плюсах. Чтобы проверить что чувак вообще может кодить.
Идея в том, что фиг они сформулируют вопрос чтобы найти готовое решение, а на стековерфлоу никто им решения не напишет за полчаса, особенно если вопрос явно выглядит как просьба решить домашку.
А потом отсеянным таким образом кандидатам дайте полдня чтобы написать сравнительно нетривиальную полную программу (ну, возьмите любую изолированную задачу такого размера над которой недавно работали и смотрите на результаты глазами, на сам код, а не на таймлимит. Потому что вас интересует хотите ли вы работать вместе с программистом который пишет такой код, а не насколько быстро он его пишет.

Whoman-in-white

ну например еще написать какой-нибудь просто алгоритм, но которого нет в стандартной библиотеке
написать реализацию std::array
написать shared_array
написать округление до целого

kokoc88

Идея в том, что фиг они сформулируют вопрос чтобы найти готовое решение, а на стековерфлоу никто им решения не напишет за полчаса, особенно если вопрос явно выглядит как просьба решить домашку.
Ты слишком высокого мнения о постоянном содержимом рынка программистов. Я сейчас нанимаю людей в вялом режиме. Задаю, казалось бы, тривиальный предварительный вопрос про, применительно к C++, unordered_set: добавить три элемента, удалить один, пройти foreach и напечатать на консоль. EDIT: Ошибся, пока писал пост. Вопрос в том, что будет напечатано на консоль. 100% кандидатов ответили на этот вопрос неправильно, то есть не потрудились погуглить или зайти на стековерфлоу.
Когда я задавал задачку на реализацию алгоритма Дейкстры, из 75 кандидатов её только два человека решили с помощью binary heap, остальные упорно писали через линейный поиск в динамическом массиве. Вдвойне странно, потому что код при этом получается не только с большей алгоритмической сложностью, но и длиннее по количеству строк.
Тест должен оценивать не разработчиков с доброфорума, которые в среднем имеют больший уровень интеллекта; а фильтровать огромное стадо баранов и выбирать тех, с кем есть о чём поговорить.

Maurog

Задаю, казалось бы, тривиальный предварительный вопрос про, применительно к C++, unordered_set: добавить три элемента, удалить один, пройти foreach и напечатать на консоль. 100% кандидатов ответили на этот вопрос неправильно
в чем троллинг подковырка? :grin:

kokoc88

в чем троллинг подковырка?
А как бы ты ответил на этот вопрос? :smirk:

Maurog

А как бы ты ответил на этот вопрос?
да в лоб бы и ответил (не компилял и на стековерфлоу не ходил еще, но я так понял, что надо сходить? :grin: )

using namespace std;
unordered_set<int> s;
//adding
s.emplace(2);
s.emplace(4);
s.emplace(42);

//erasing
s.erase(42);

//printing
for (const auto& x : s)
{
cout << x << end;
}

kokoc88

да в лоб бы и ответил (не компилял и на стековерфлоу не ходил еще, но я так понял, что надо сходить? )
Бля, ошибся пока писал пост. :crazy: Я его отредактировал, идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консоль.

marat7256

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

Maurog

Бля, ошибся пока писал пост
хехе, крепко я заквотировал тебя :grin:
ну а твой EDIT уже понятен и неинтересен для меня как разминка для ума, в целом хороший вопрос для первичного отсеивания

kokoc88

ну а твой EDIT уже понятен и неинтересен для меня как разминка для ума, в целом хороший вопрос для первичного отсеивания
Дело в том, что применительно к C++ вопрос получается действительно слишком тривиальным. В C# имена коллекциям придумывали тоже бараны, поэтому там этот вопрос более уместен. Я всего лишь привожу его как пример. К основному смыслу моего поста он не имеет отношения: даже простые вопросы будут отсеивать очень много кандидатов.

Maurog

идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консоль
золотая работа, когда начальник пишет код, а тебя лишь спрашивают "сойдет?" :grin:

Maurog

В C# имена коллекциям придумывали тоже бараны
лично мне не нравятся названия unordered*, заобфусцировали классические hash контейнеры :(

apl13

лично мне не нравятся названия unordered*, не взяли на себя обязанность использовать строго классические hash контейнеры :(

kokoc88

лично мне не нравятся названия unordered*, заобфусцировали классические hash контейнеры
Может быть, из-за этого у кого-нибудь самолёт упал или спутник? :) Впрочем, по мне что unordered_, что hash_ лучше, чем просто List и Dictionary. Потому что 95% кандидатов искренне верят, что List - это одно-дву-связный список; а про Dictionary я наслушался таких сказок, что страшно спать по ночам.

Julia79

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

kokoc88

Если ты сам пишешь код и у кандидатов есть возможность погуглить/спросить стак-оверфлоу, что им мешает откомпилировать код на любом онлайн компиляторе и тупо скопировать ответ (я бы наверное так и сделал - минимально по трудозатратам и точно не ошибешься).
Если ты тупо скомпилируешь код и скопируешь ответ, то ошибёшься. Если ты погуглишь/спросишь и после этого дашь правильный ответ, то я готов позвать тебя на собеседование. В текущей итерации поиска программистов из 50 кандидатов ни один не прислал правильный ответ; то есть никто не погуглил, не спросил совета, вообще не почесался.

Maurog

не взяли на себя обязанность использовать строго классические hash контейнеры
а чем отличаются unordered от классических хеш контейнеров?

Julia79

Если ты тупо скомпилируешь код и скопируешь ответ, то ошибёшься.
Хм, это интересно но непонятно - если вопрос в том,что программа выведет на экран, я компилирую и запускаю программу, и присылаю результат выполнения - как я могу ошибиться? Должны быть какие-то дополнительные условия... Я отказался от подобных задач в тесте по причине того что их легко проверить компиляцией даже не читая код...

kokoc88

Хм, это интересно но непонятно - если вопрос в том,что программа выведет на экран, я компилирую и запускаю программу, и присылаю результат выполнения - как я могу ошибиться? Должны быть какие-то дополнительные условия...
В этом случае никаких дополнительных условий нет. Но скопировать результат выполнения программы нельзя. Если ты не можешь правильно ответить на этот вопрос, то как ты собираешься проводить собеседования?
Я отказался от подобных задач в тесте по причине того что их легко проверить компиляцией даже не читая код...
Эта задача не подобная.

Julia79

А, идея в том что элементы могут быть напечатаны в любом порядке - зависит от компилятора и имплементации std::unordered_set т.к. он UNORDERED :)! правильно?
Интересная задача, ты не против если я включу в тест :grin: ?

apl13

а чем отличаются unordered от классических хеш контейнеров?
Тем, что из их названия нельзя предположить, что они непременно должны быть сделаны на хешах, ня?

Maurog

Тем, что из их названия нельзя предположить, что они непременно должны быть сделаны на хешах
в стандарте явно видно, что без хешей никак
http://www.cplusplus.com/reference/unordered_set/unordered_s...

apl13

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

Whoman-in-white

Да не, просто вроде как при названии контейнера в стл всегда руководствуются внешними свойствами контейнера, а не структурой данных, на которой он основан. Как бы и set наверно у всех реализован как красно-черное дерево, но называется тем не менее set

apl13

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

bav46

пинг понг без Bool в начале для 2х процессов потом для n процессов, задача подходит для java, C#, c++
результат всегда должен быть
ping
pong
ping
pong
ping
...

capxaH

Вот клевая задачка, но это повышенный уровень сложности.
Дано 1000 монет и 10 конвертов.
a) Придумайте способ разложить эти монеты по конвертам, чтоб можно было выдать любую сумму от 1 до 1000 не распечатывая конверты. ( простая часть)
б) Напишите программу подсчитывающую количество способов так разложить монеты. (вот тут посложнее, хотя тоже решается на бумажке)

agent007new

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

apl13

На сколько мне известно, назвать-то хотели как раз hash_фигня, но из-за тысяч уже нестандартных существующих реализаций, решили, что будет путаница, поэтому и решили назвать по-другому
Ну еще, например, так:
внутренне это не обязательно хэш. Один и тот же контейнер может иметь разную private structure, в зависимости от размера и прочего времени суток.

istran

Писали уже выше, что один из шаблонных параметров это Hash. И в конструктор можно хэш-функцию передавать.

apl13

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

Maurog

внутренне это не обязательно хэш
хватит уже ерунду морозить
http://www.cplusplus.com/reference/unordered_map/unordered_m...
ищем секции Buckets / Hash policy
SO: http://stackoverflow.com/questions/1646266/difference-betwee...

apl13

Может, ты лучше поищешь про observable behaviour?

PooH

ИМХО, лучше взять какую-то специфичную задачу из тех, которые стандартно попадаются у вас в работе, подпилить ее, избавив от лишних деталей и ее использовать в качестве теста.

Julia79

ИМХО, лучше взять какую-то специфичную задачу из тех, которые стандартно попадаются у вас в работе, подпилить ее, избавив от лишних деталей и ее использовать в качестве теста.
Да, мы так и делаем - на собеседовании. Идея теста в том чтобы отсеять явно некомпетентных людей, поэтому жесткий лимит по времени, и очень простые задачи чтобы проверить стиль кодирования и адекватность.

Julia79

Всем спасибо за советы, особенно и .
Если кому интересно и полезно, вот окончательная версия теста:
1. Напишите консольное приложение которое печатает аргументы переданные через командную строку в следующем формате:
{"аргумент1";"аргумент2";...;"аргумент3"}.
Примеры:
testApp.exe 4 5 6 - > {"4";"5";"6"}
testApp.exe - > {}
testApp.exe "C:\" 34 5.164 - > {"C:\";"34";"5.164"}
2. Напишите оператор сравения (<) для структуры

template <class T1, class T2, class T3>
struct Triplet
{
T1 elem1;
T2 elem2;
T3 elem3;
};

Оператор должен возвращать результат сравнения первых элементов, в случае равенства первых элементов - результат сравнения вторых элементов, и в случае равенства вторых элементов результат сравнения третьих элементов.
Примеры:
(3,4,5) < (1,1432,4353) -> false
(3,4,5) < (3,4,5) -> false
(3,4,5) < (3,4,6) -> true
3. Напишите функцию получающую строку вида "ключ1===значение1:ключ2===значение2:...", где ключи и значения некие строки в формате аскии, не содержащие символов : и =. Функция должна вернуть std::map<std::string,std::string> заполненную данными ключами и значениями.
Примеры:
[test===xyz:yy===abcde]
[1===John:2===Mary:3===Richard]
[123===456:new key===new value]
4. Какой результат выведет приведенная программа:

#include <iostream>
#include <string>
#include <unordered_set>

int main
{
std::unordered_set<std::string> inputSet;

inputSet.emplace("Hello world");
inputSet.emplace("Abcdef");
inputSet.emplace("This is the test string...");
for(const auto &val : inputSet)
std::cout << val.c_str << std::endl;
return 0;
}

Whoman-in-white

получился слишком узкий набор заданий, вот че бы например просто не пройтись по темам в Саттере или Мейерсе и не составить вопросы по этим темам? а так чет не очень тест, чесслово

yroslavasako

бинарный поиск включи. хрена с два кто на раз без багов напишет
элементарно. Только рекваймент на размер массива поставить так, чтобы он гарантированно за int не выходил. И никакой хитрой арифметики не нужно, о которой так много бесполезных рецептов постят.

istran

WTF? В четвертой результат не определен, точнее определен, но с точностью до перестановки строк.

Julia79

WTF? В четвертой результат не определен, точнее определен, но с точностью до перестановки строк.
Поздравляю, ты прошел тест - это и есть правильный ответ! А любой ответ полученный компилированием и copy paste - неправильный ;)

Julia79

получился слишком узкий набор заданий, вот че бы например просто не пройтись по темам в Саттере или Мейерсе и не составить вопросы по этим темам? а так чет не очень тест, чесслово
Это вариант - он даст более точную оценку кандидата при условии что кандидат напишет тест сам и не будет пользоваться stackoverflow , но тогда нужно увеличить время на тест. На собеседовании мы спрашиваем о текущем проекте, в форме развернутого обсуждения - и там принимаем окончательное решение. Тест - он только чтобы отсеять совсем неквалифицированных людей - не нужно покрывать много тем, все что нужно это получить пару образцов стиля программирования и проверить общую вменяемость.
Сегодня первый кандидат писал тест - за пол-часа решил первый вопрос с ошибками, начал второй но полностью запутался в определении оператора сравнения и так его и не закончил, даже не начал последние два вопроса.

NataNata

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

Julia79

О_о
а какую сумму предлагаете успешно прошедшему, если не секрет?
Точно не знаю - я этот вопрос не решаю, думаю в районе 70-90 тысяч в год в зависимости от квалификации (мы в Канаде, Торонто).

Maurog

мы в Канаде, Торонто
трололо
наконец-то стало понятно для чего этот тест :grin:

apl13

— Может, бросить все и рвануть в Урюпинск Торонто?..

istran

Понятно =) Там кстати вызов ".c_str" в теле цикла не нужен.

6yrop

Хороший вопрос - первое найденное before нужно заменить на after.
ты считаешь себя квалифицированным?

Julia79

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

NataNata

Точно не знаю - я этот вопрос не решаю, думаю в районе 70-90 тысяч в год в зависимости от квалификации (мы в Канаде, Торонто).
За такой тест 90к - это щедро, очень щедро 8)

domovoj

За такой тест 90к - это щедро, очень щедро 8)
За такими тестами всегда следуют личные собеседования, на которых и начинается веселье.
Оставить комментарий
Имя или ник:
Комментарий: