none
Помогите оценить уровень набора заданий для кандидатов C# RRS feed

  • Общие обсуждения

  • Для начального отсева кандидатов в нашей компании был разработан тест из трех простеньких задач. Помогите оценить их корректность.
    У нас в данный момент идет увеличение количества выполняемых проектов. Мы заинтересованны в найме работников. Но как то последнее время (видимо проснулись бывшие студенты) сильно упал уровень знания кандидатов, и возросли их ожидания. Агенству в которое приходят кандидаты был предложен начальный тест, позволяющий отсеять разработчиков низкого уровня.

    Цель - отсеять тех кто имеет самое поверхностное знание. Город Москва. Уровень зарплаты далеко не самый низкий мы запрашиваем. А от 50 тысяч в месяц (И выше в зависимости от навыков разработчика)

    Но проблема в том что эти задания никто оказывается не может решить - и говорят что они составлены не коректно. Неужели задачи на столько сложны что мы отсеиваем много больше чем самых новичков?

    Тест представлен ниже

    1) На каких из перечисленных строчек объявляются переменные значимого типа:
                 int x = 10; //1
                string s = "строка"; //2
                object o = 20; //3
                int y = new int(); //4
                int? z = null; //5
                object o2 = y; //6
                object o3 = new object(); //7
    1. 1 2 4
    2. 1 4 5
    3. 1 3 6
    4. 1 2 5
    5. 1 2 3 6
    6. 1 2 3 4
    7. 1 4
    2) Что выведет представленный ниже код:

        static class Program
        {
            static const int NaturalMin = 1;
            static bool IsNatural(int x)
            {
                Console.Write("IsNatural({0}) ", x);
                return x >= NaturalMin;
            }

            static readonly string EmptyString = "";
            static bool IsEmpty(string s)
            {
                Console.Write("IsEmpty({0}) ", s);
                return s == EmptyString;
            }

            static void Main(string[] args)
            {
                int x = 10;
                string s = "";
                Console.WriteLine(IsNatural(x) || IsEmpty(s));
            }
        }

    1. IsNatural(10) false
    2. IsEmpty() false
    3. IsNatural(10) true
    4. IsEmpty() true
    5. IsNatural(10) IsEmpty() true
    6. IsNatural(10) IsEmpty() false
    7. IsEmpty() IsNatural(10) true
    8. IsEmpty() IsNatural(10) false
    9. IsNatural(10)
    10. IsEmpty()
    11. IsNatural(10) IsEmpty()
    12. IsEmpty() IsNatural(10)
    13. true
    14. false
    15. код не скомпилируется

    3) Что выведет представленный ниже код:

        public class A
        {
            public A()
            {
                Console.WriteLine("1");
                Print();
            }

            public virtual void Print()
            {
                Console.WriteLine("2");
            }
        }

        public class B: A
        {
            public B()
            {
                Console.WriteLine("3");
                Print();
            }

            public new void Print()
            {
                Console.WriteLine("4");
            }
        }

        static class Program
        {
            static void Main(string[] args)
            {
                A b = new B();
                b.Print();
            }        
        }


    Варианты ответов:

    1. 1
    2. 2
    3. 3
    4. 4
    5. 12345
    6. 122
    7. 42
    8. 124
    9. 342
    10. 344
    11. 12342
    12. 12344



    На самом деле вопросы с ответами - они могут многое подсказать. Извиняюсь что не написал их сразу, наверное чисто из экономии места. Но это многое меняет. Если кому интересно правильные ответы:

    1-2

    2-3

    3-11

    • Изменено xanrum 16 октября 2012 г. 11:41
    16 октября 2012 г. 7:52

Все ответы

  • "Но проблема в том что эти задания никто оказывается не может решить - и говорят что они составлены не коректно. Неужели задачи на столько сложны что мы отсеиваем много больше чем самых новичков?" - это задания для школьников, проще некуда. Если и их не потянут, то сказать нечего.
    16 октября 2012 г. 9:04
    Модератор
  • ну если честно, хоть я и новичёк, но не совсем уж. (самоучка)
    в школе нас не учили шарпу )
    там был кубейсик

    а по сути:
    вот например
    int? z = null; //5
    одно знание мне говорит, что значимым можно присвоить значение, но как бы не null.
    с другой стороны,
    я помню, что Nullable<T> является структурой,
    так что наверное всё-таки это значимый тип.
    Я прав?

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

    думаю может даже несколько лет успешного программирования может пройти до того как понадобится обдумать это всё.
    дальше особо не смотрел,
    а.. в 3-м примере можно затрудниться,
    у меня на первый взгляд (хотя бы на 1-й) не появится идея, что выведется 12342.
    мне тут надо вглядываться хотя бы немного.
    хорошо ещё new заметил вместо override.

    Так что простым студентам, которые не стажировались где-то в фирмах, занимающихся постоянным созданием программ,
    будет сложновато ответить.
    Ну про наследование могут в принципе, лишь бы сразу не писали ответ, а проверили.
    А вот в Nullable<T>, думаю тут только что бывшие студенты могут ошибиться,
    не сталкиаясь с этим. Там же всё равно это надо обычно только для значимых типов.

    Хорошо хоть я ответил на эти вопросы, надеюсь правильно )
    А то бы и меня в школьники записали.





    • Изменено INFEL8 16 октября 2012 г. 10:00
    16 октября 2012 г. 9:51
  • "Так что простым студентам, которые не стажировались где-то в фирмах, занимающихся постоянным созданием программ, будет сложновато ответить." - это как раз вопросы, требующие начальной подготовки, из учебника. А повседневный труд уже даёт совершенно другой уровень знаний, если не знать простые вещи то в последующем будет очень сложно.
    16 октября 2012 г. 10:00
    Модератор
  • Задания, в целом, простые. Но они не обязательно точно выявят знания программиста. Прошедший их можно оказаться просто зубрилой, выучившим основы языка, но на деле не способным самостоятельно решать поставленные проблемы.

    Мне понравилось второе задания. Я попался на то, что оператор || применён в Console.WriteLine. Если бы это выражения стояло в операторе if, то я бы сходу сообразил, что вызов IsEmpty не произойдёт. А так - ошибся.

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

    ---

    Обсуждения разных тестовых заданий и тому подобного часто бывают на форуме rsdn. Споры там разгораются жаркие, мнения сильно разделяются. Следует учитывать разные факторы. Опытный программер, взглянув на такие задания, может просто плюнуть, и пойти искать другую контору. Неопытный может находиться в сильном состоянии стресса, и поэтому ошибиться, хотя на деле знает (вот походит по собеседованиям, научится держать себя в руках).

    В какой форме проводится тестирование? Сколько времени даётся? Интересует ли вас ход мыслей подопытного? Или только ответы типа "да", "нет"? Например, в третьем задании, дав неправильный ответ, может ли человек взять реванш, пошагово описывая процесс создания объекта и вызова методов, а вы при этом подправите его ход мыслей, указав, где он сбился?

    16 октября 2012 г. 10:39
  • ну то мож не побочные действия, а отладочные данные, которые потом замучаешься удалять.

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


    • Изменено INFEL8 16 октября 2012 г. 10:54
    16 октября 2012 г. 10:54
  • Задачи составлены корректно, с уклоном в сторону досконального знания спецификации C#. Только нужно ли это нанимаемым?

    Задача 1: С учетом gengeric'ов, действительно ли сейчас важно задумываться об упаковке/распаковке?

    Задача 2: Что вы пытаетесь ей проверить? Я упялился в || и совсем забыл, что возвращаемое значение тоже будет преобразовано в строку. Да, я не собираюсь к вам устраиваться на работу и безответственно отношусь к решению задач, но многие именно из-за волнения могут сбоить на такой простой вещи.

    Задача 3: У вас действительно встречается в коде иерархия классов с new и вы закладываете логику в конструктор?

    Конечно, составить формальный тест для отсева "новичков" достаточно сложно, но постарайтесь все-таки сделать вопросы близкие к решаемым вами задачам. Эти, что-ли, больно уж академические.

    16 октября 2012 г. 11:06
    Модератор
  • "Задачи составлены корректно, с уклоном в сторону досконального знания спецификации C#. Только нужно ли это нанимаемым?" - я бы так не сказал, скорее с хорошим уровнем.
    16 октября 2012 г. 11:22
    Модератор
  • простое наводнение:
    ответы появились,
    жаль не указано что правильно а что нет.
    у меня пока получилось: 2 3 11 соответственно. (понятия не имею правильно или нет, я просто все объеты назвал ссылочными)

    Но я думаю, что варианты ответов не повлияли бы на ответы тех, кто уже ответил.

    • Изменено INFEL8 16 октября 2012 г. 11:30
    16 октября 2012 г. 11:28
  • Я лично считаю, что:  если человек должен прийти и работать, т.е. это уже готовый специалист, то эти вопросы ещё цветочки. А если это для студентов и начинающих, то это самое то. Не важно чтобы они могли ответить на все 100%, главное чтобы мозги работали.
    16 октября 2012 г. 11:29
    Модератор
  • Задачки плохие. Они расчитаны на то, что человек знает какую-то определенную область, но при этом занимают достаточно много времени на решение. В итоге вы мало узнаете о человеке, тратя много времени (пусть даже если это только его время). Если хотите именно такие задачи давать, то лучше в виде теста, сделать их проще, но зато не 3 штуки, а 5.

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

    Нет задачи на логику. При этом такую задачу можно сделать устной - чтобы человек рассказал как бы он решал эту проблему в общих чертах.

    16 октября 2012 г. 11:42
    Отвечающий
  • Уточню - тест именно не для набора студентов. А разработчиков с хоть какими нибудь навыками, с соответствующими условиями. Но в последнее время пошел поток "немного знающих" и перед хоть каким либо общением Решили ввести этот тест. А есть какие нибудь предложения как отсечь тех кто не знает даже самого минимума, не читал литературы и не писал приложения в ООП стиле?

    Про догадливость в задачах я выложил именно тот тест что дается - а он дается с вариантами ответов.

    16 октября 2012 г. 11:46
  • "Уточню - тест именно не для набора студентов. А разработчиков с хоть какими нибудь навыками, с соответствующими условиями." - тогда он в самый раз. Если человек не знает такие вещи, значит нет опыта у него, так как с этим он должен каждый день сталкиваться. Когда я проходил собеседование, на приём, вопросы намного сложными были.
    16 октября 2012 г. 11:52
    Модератор
  • На мой взгляд тест не выполняет свою функцию и является плохим.
    Зачем большинству разработчиков разбираться в этих тонкостях? Ведь разработка на C# это RAD, не зная таких тонкостей можно написать не менее качественно работающее приложение. Затратив на это даже меньше рабочего времени чем делая все "правильно".

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

    Так же есть множество разработчиков пришедших из других языков - что имеют не плохую алгоритмическую подготовку, но еще не разобравшихся в тонкостях - неужели это правда такие не достойные разработчики? 
    16 октября 2012 г. 12:18
  • "Зачем большинству разработчиков разбираться в этих тонкостях?" - ничего себе тонкости. Это базовые знания языка, ели их человек не знает и называет себя разработчиком, то дальше некуда. Оно дело не знать про внутреннее устройство делегатов, замыкания, вариантность и прочее...другое про последовательность создания объектов и базовые типы, что и показывает данный тест.

    "Ведь разработка на C# это RAD, не зная таких тонкостей можно написать не менее качественно работающее приложение." - хотелось бы взглянуть на такие приложения. У меня на бывшей работе половина таких были, писали код тяп-ляп, не вникая в суть, (хардкод одним словом). Потом приходилось за ними чистить, знаете сколько времени на это уходило, не говорю о последующем сопровождении кода.

    "Затратив на это даже меньше рабочего времени чем делая все "правильно" - и будет Вам хардкод, а это ужас.

    "На мой взгляд надо давать практические задачи" - безусловно, одной теории мало.

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

    16 октября 2012 г. 12:34
    Модератор
  • Я вообще не представляю, как вы с такими тестовыми заданиями хоть кого-то набираете. Нормальный разработчик, встретив такое в качестве первого теста, покрутит пальцем у виска и уйдет. Потому что на практике "что выведет такая-то программа ..." решается нажатием Ctrl+F5.

    Насколько я понял, основные требования к тесту:

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

    Сомневаюсь, что подобный тест вообще можно составить. Замените тест на обязательное требование чего-то из списка:

    • опыта в N лет
    • отыва с предыдущего места работы/стажировки (чтобы не отсеивать толковых студентов)
    • ссылки на профиль на github/codeplex/bitbucket
    • профиля на любом фрилансерском сайте
    16 октября 2012 г. 18:15
    Модератор
  • static const int NaturalMin = 1;
    Ммммм, вкусняха

    20 февраля 2018 г. 15:15
  • Нормальный тест.

    Моих знаний хватило на 1 из трех вопросов(((

    1. Помнить названия типов это разве проверка на программистов-практиков? Лично мне лениво помнить все названия(((

    2. Легкое и простое задание для практика, решила легко)))

    3. Изучить наследование так и не смогла, лениво(((

    Замените первый вопрос лучше на знания видимости переменных и доступности их в коде (static, public, internal и прочее). И будет отличный тест для поиска тех кто имеет начальный опыт программирования.

    20 февраля 2018 г. 17:55
  • Да автору уже поздно советовать, учитывая, что тема 2012 года. 
    20 февраля 2018 г. 19:07