?

Log in

No account? Create an account
entries friends calendar profile My Website Previous Previous Next Next
Доктор, что я делаю не так? - Уголок Школьника
scolar
scolar
Доктор, что я делаю не так?
Длинный опус на тему интервьюирования программистов, на этот раз в Америке. Я, похоже, завалил очередного кандидата, и что-то мне начинает казаться, что проблема немножко во мне - резюме у него было идеальное.

Как я интервьюирую.

Первая задача, которую я даю на интервью:
1.  Вычислить f(5), где

int f (int x)
{
    if (x == 0) return 1;
    return f(x-1)*x;


Итак: факториал. Никто ещё этого слова не произнёс, даже если вдруг и вычисляют правильно. Вторая задача:

2. Написать эквивалентную функцию без рекурсии. Я действительно не могу понять, почему человек, перед которым лежит бумажка, на которой он сам минуту назад перемножил числа от 1 до 5, не может написать цикл.

Следующая моя микрозадача - выяснить, насколько человек понимает C++. Вообще-то мы когда-то сделали в Москве хороший опросник минут на 40, но тут до шаблонов вообще и тонкостей реализации STL-контейнеров в частности я ещё ни с кем не добрался. Сегодня я ограничился двумя задачами из этого опросника:

3. Дан следующий фрагмент кода. Вопросы (задаются последовательно):
      а) как отреагирует на него компилятор
      б) как нужно модифицировать объявление поля int a, чтобы компилятор согласился с такой функцией f().

class A
{
    int a;

    void f () const
    {
        a++;
    }
};

Такое ощущение, что слово mutable даже не китайская грамота (китайцы его тоже не знают), а пришло из русского языка.

Следующая задача - на понимание наследования, виртуальных деструкторов и указателей на объекты.

4. Что будет напечатано данной программой:

#include <iostream>
using namespace std;

class A {
public:
    A ()
    {
    std::cout << "A";
    }
    ~A ()
    {
    std::cout << "~A";
    }
};
class B : public A
{
public:
    B ()
    {
       std::cout << "B";
    }
    ~B ()
    {
       std::cout << "~B";
    }
private:
  int value;
};

int main ()
{

    A* a = new B;
    delete a;
    return 0;
}

То, как объект создаётся, понимают почти все. То, как разрушается, - почти никто. 

Что касается сегодняшнего кандидата, там в бэкраунде значились статьи в Dr.Dobb's Journal и большой опыт написания драйверов для Windows и Linux, real-time приложений и т.д.

5. Мы решили обсудить, как написать sniffer под Windows. Кандидат грамотно рассказал про особенности стека протоколов, и рассказал как работает WinPCap. Однако на вопрос, почему WinPCap не может захватывать локальный трафик ответить не смог. После намёка на то, как устроен local loopback, впрочем, он заметил, что TDI-сниффер решает эту проблему. Зачтено.

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

7. На вопрос, знаком ли он с POSIX threads, ответил, что знаком с pthreads.

8. Попросил его придумать read-write lock, используя mutex'ы и conditional variables. Скорее не сделал, чем наоборот.

И это был лучший кандидат. Я что, слишком многого хочу от человека, который драйверы писать будет?!
25 comments or Leave a comment
Comments
From: a7sharp9 Date: November 29th, 2006 02:38 am (UTC) (Link)
Учитывая, что он сделал пятый, и если решил хотя бы приблизительно первые четыре - да, действительно сильный. Мне такие и близко не встречались, из нескольких десятков подопытных.

Я всегда считал, что любому человеку найдется применение, за соответствующие деньги. Если у него не было слишком завышенное о себе мнение, то можно было бы предложить ему чуть меньше на старт и взять. А когда по долгу службы разберется с полным POSIX и пару раз отдебагит последовательность деструкторов, то повысить.
From: quieres Date: November 29th, 2006 04:44 am (UTC) (Link)
В пункте 3 наверное volatile, а не mutable? А по пункту 8: функции наподобие InterlockedExchange из винапи были в наличии?
scolar From: scolar Date: November 29th, 2006 05:35 am (UTC) (Link)
Нет, именно mutable, а не volatile. Ибо volatile означает, что переменная может быть модифицирована внешним образом. Главным образом, этот модификатор - напоминание компилятору и линкеру о том, что с оптимизациями нужно поаккуратнее. Собственно, это ключевое слово идёт ещё из чистого C.

Ключевое слово mutable введено в C++, и именно по той причине, о которой я спрашивал в задании 3: это разрешение константному методу изменять соответствущее поле. Ну и конечно, опять-таки напоминание оптимизатору, что не всё так просто с этим классом.

По поводу пункта 8: задача была на pthreads: имеющихся там средств (mutex + conditional variable) вполне достаточно, для [не самой эффективной] реализации read-write lock'a.
scolar From: scolar Date: November 29th, 2006 05:42 am (UTC) (Link)
Но вообще-то, заметим, самомнение - великая вещь: Вы, вот, решили в пункте 3 меня поправить, даже не усомнившись на секунду, что возможно я прав, а Вы ошибаетесь. Хотя Страуструп или Гугл развеяли бы Ваши сомнения за считанные секунды. Я же, будучи 100% уверен (опросник за 4 года, что мы его написали, давался уже, наверное, паре сотен человек, и небольшие ляпы, что мы допустили, давно уже вычищены) полез листать классика, прежде чем Вам отписать.
upstartn From: upstartn Date: November 29th, 2006 06:11 am (UTC) (Link)
5-7 не знаю, остальные знаю
на с++ не программировал около 6 лет, до этого писал немного в ВУЗе. Как дальше жить? :)
scolar From: scolar Date: November 29th, 2006 06:16 am (UTC) (Link)
Может к нам работать, а? Или настолько к Java прикепел, что ничего другого уже не надо? Хотя, с другой стороны, зачем к нам с C++, если можно в Гугл с Java.
upstartn From: upstartn Date: November 29th, 2006 06:22 am (UTC) (Link)
Хех, прикипел не так к java, но к нынешней работе.
Да и вообще, вы далеко, а я в Украине обычно (точнее, именно сейчас в Чикаго, но это очень временно), но за приглашение спасибо :)
From: vinopivets Date: November 29th, 2006 06:29 am (UTC) (Link)
...какой, все-таки, нечитабельный этот С++, просто ужас. Не Forth, конечно, но близко...
scolar From: scolar Date: November 29th, 2006 06:37 am (UTC) (Link)
Дело привычки, на самом деле.
From: vinopivets Date: November 29th, 2006 06:54 am (UTC) (Link)
Оно конечно. Только, думал я некогда, к чему моему курению еще и С... Подумал - и бросил коды писать.
scolar From: scolar Date: November 29th, 2006 06:56 am (UTC) (Link)

И это правильно

Нам, вот, в школе с детства внушали: можешь не программировать - не программируй.
rshura From: rshura Date: November 29th, 2006 07:33 am (UTC) (Link)
Даешь опросник на Python-е!

Кстати, если я не вру, в некоторых (многих?) языках цикл имплементирован через рекурсию. В свете чего ещё смешнее нерешение 2 после решения 1.
_ai_ From: _ai_ Date: November 29th, 2006 09:11 am (UTC) (Link)
Мои воспоминания курса компиляторов говорят что скорее наоборот:
tail recursion is implemented as a loop.
upstartn From: upstartn Date: November 29th, 2006 01:00 pm (UTC) (Link)
ОЙ, а это зачем?
upstartn From: upstartn Date: November 29th, 2006 01:01 pm (UTC) (Link)
чтобы не сработало эффективно, не дай-то бог? ;)
pargentum From: pargentum Date: November 29th, 2006 08:50 am (UTC) (Link)
Ну я бы на первый вопрос тоже не произнес бы слова "факториал". Во всяком случае, если бы специально не спросили. Потому что задача ведь посчитать, что она вернет, а не как оно называется. И таблицу факториалов я наизусть не знаю, хотя и могу посчитать факториал пяти в уме (вот сейчас посчитал).
scolar From: scolar Date: November 29th, 2006 10:33 am (UTC) (Link)

Re: ЗЫ

Ну, не знаю, а я бы, выписав 5*4*3*2*1, хлопнул бы себя по лбу и сказал: "ба, да это ж факториал". Но это мелочи, разумеется.
midp20 From: midp20 Date: December 2nd, 2006 12:44 am (UTC) (Link)

Физтехи и факториалы

Раз уж залез, по поводу современных молодых физтехов (и не только), приходящих программистами. Двое из трёх на мою простую задачку дают следующий ответ:

В. Сколько рёбер в полном графе из n вершин?
А. n!

scolar From: scolar Date: December 2nd, 2006 12:47 am (UTC) (Link)

Re: Физтехи и факториалы

Да, я в последний год перед отъездом собеседовал несколько человек с ФУПМа (или как он там теперь, и экономики), и был в унынии: бренд остался, а качество ниже плинтуса.
pargentum From: pargentum Date: November 29th, 2006 08:58 am (UTC) (Link)

ЗЫ

А что, драйверы нынче с использованием STL и наследования пишут?
scolar From: scolar Date: November 29th, 2006 10:49 am (UTC) (Link)

Re: ЗЫ

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

Другая тактика - понять, насколько человек разбирается в том, что он делал (ну, или говорит, что делал). Здесь ты выкидываешь те его навыки, в которых ты совсем не копенгаген, и обсуждаешь в деталях те пункты резюме, в которых у вас пересечения. Скажем, если человек пишет, что владеет C++ и ATL, но не понимает, каков жизненный цикл объекта - значит он программирует на копи-пейсте. Или вообще врёт.

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

upstartn From: upstartn Date: November 29th, 2006 01:06 pm (UTC) (Link)

Re: ЗЫ

Вторая тактика более разумна, мне кажется.
Вобщем-то и сам ее применяю, когда провожу собеседование.
При этом не забываю мнения своего университетского преподавателя по мат анализу, что оценку человеку можно ставить, услышав как он говорит свои имя и фамилию. Способ не 100% надежный,но как один из критереив.
max_ushakov From: max_ushakov Date: November 29th, 2006 02:18 pm (UTC) (Link)
Ну откуда драйверописателю (по крайней мере, под Linux) знать C++? Ты видел хоть один деструктор в коде ядра? :)

Но первые две задачи показательны, показательны!
nadja_s From: nadja_s Date: November 29th, 2006 03:52 pm (UTC) (Link)
Мне, человеку далекому от программирования, было удивительно увидеть вопросы 1 и 2!
a_bronx From: a_bronx Date: November 30th, 2006 03:21 am (UTC) (Link)
1-2й вопросы - достаточно богатые, если предложить кандидату переписать, избавившись от оверхеда (можно одно умножение сэкономить и фрейм для исключений не генерить в с++) и от лишних строк :)

int f(int x) throw() { return (x>2) ? f(x-1)*x : x; }

int f(int x) throw() { int p=x; while(--x>1) p*=x; return p; }

(На проверку диапазона забьём, пусть вызывающий проверяет :)

Т.к. с сетями работал чисто на прикладном уровне, то на 5-6 без гуглевания не ответил бы. 7-й - освежать надо, потому как венда. 8-й - тоже кой-что вспоминать надо, потому как всё уже в библиотеках и некоторые тонкие детали реализации (например, дабл-чеки) забываются. Или вот: делать ли лок рекурсивным или нет - тема для целого холивора :)

Кстати, реши я сейчас проходить интервью - наверняка без гугла под рукой многое завалю (кроме совсем примитивного), потому как держать всё тонкости в памяти просто нету сил, тут бы все существенные концепции удержать... :-\
25 comments or Leave a comment