Парни из Parallels не зря пользуются уважением среди нашего брата программиста. Именно в этой компании придумали контейнерную виртуализацию (и уже реализовали возможность живой миграции контейнеров), сделали такой крутой и всемирно известный продукт, как Parallels Desktop для Mac, и научили смартфоны и планшеты под iOS и Android удаленно воспринимать десктопные приложения с Mac и ПК как нативные (Parallels Access).

Офис Parallels имеет все признаки «офиса мечты», тем более что именно там работают такие крутые специалисты, как технический советник Linux Foundation и мейнтейнер ядра Linux Джеймс Боттомли, создатель 90% стека TCP/IP в Linux Алексей Кузнецов, самый известный хакер 2000-х Алексей Смирнов, создатель Windows NT Марк Збиковски (кстати, сигнатура exe-файла, MZ, — это его инициалы. — Прим. ред.) и автор проекта CRIU Павел Емельянов. Если хочешь влиться в их стройные ряды — решай наши задачки! Между прочим, некоторые из них предлагают на собеседовании прямо сейчас :).

Какие Вакансии есть в Parallels?

Сейчас команда разработчиков активно расширяется (а все продукты с мировой известностью делают исключительно в России) — только в московском офисе открыто более 40 вакансий, причем практически во все команды. Больше всего нужны мобильные разработчики (iOS, Android), те, кто будет писать для ядра Linux, а также разработчики в команду облачной платформы Parallels Automation. Собеседования в Parallels редко длятся меньше часа (если меньше, можешь собраться и уйти — пазл не сошелся). Чтобы не терять этот час жизни, попробуй решить сначала их задачи. Все, кто пришлет правильные ответы, полу- чат лицензии на Parallels Desktop для Mac 10 и Parallels Access, а также, как предупреждают в компании, горячий интерес ее эйчаров и тимлидов. Хотя там смотрят прежде всего на логику решающих и опыт и могут нанять даже тех, кто задачи не решил, но чей ход мысли понравился.

 

 

Задачи на логику

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

Задача 1

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

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

Вопрос: насколько быстрее движется поезд по сравнению с человеком?

Задача 2

Крестьянину нужно перевезти через реку волка, козу и капусту. Но лодка такова, что в ней может поместиться только крестьянин, а с ним или один волк, или одна коза, или одна капуста. Но если оставить волка с козой, то волк съест козу, а если оставить козу с ка- пустой, то коза съест капусту. Сколько реше- ний имеет эта задача (нет, не одно ;). — Прим. ред.)?

 

Программные задачи

Задачи 3 и 4 проверяют знание POSIX-подсистем и то, как человек думает в ситуации, когда на кажущийся ему очевидным ответ собеседующий говорит, что этот ответ неверен.

Задача 3

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

#include <unistd.h>
#include <stdio.h>
int main()
{
         printf("Hello");
         fork();
return 0; }

Вопрос: что будет напечатано?

Задача 4

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

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int pid;
void handler()
{
     printf("%d\n", pid);
     exit(0);
{
   signal(SIGCHLD, handler);
   pid = fork();
          wait(NULL);
   return 0;
}
}
int main()

Вопрос: что будет напечатано?

 

Задача 5

Сколько памяти занимает такая структура?

struct xx {
            uint8_t a;
            uint16_t b;
            uint32_t c;
            uint64_t d;
};

Задача 6

Примечание: вопросы типа «Какие функции для аллокации памяти вы знаете в ядре Linux?» или «Какие примитивы синхронизации в ядре Linux доступны для програм- миста?» не задает только ленивый. Их касаться даже неинтересно. Гораздо интереснее попросить человека построить уже известный примитив, не сказав о том, что он уже известен.

У вас есть некоторая система, которая должна обновлять некоторый счетчик (64-битный на 32-битной архитектуре) и технически не может выполнить операцию атомарно. Это обновление происходит очень часто и должно выполняться очень быстро, например в обработчике прерывания от устройства. Также известно, что это обновление может быть вызвано только на одном процессоре, то есть синхронизировать обновления между собой не надо. Использование стандартного спинлока реально замедляет систему и не подходит. Нужно развязать это изменение счетчика с его чтением, которое происходит а) редко, б) из контекста пользовательского процесса и может происходить относительно медленно.

Задача 7

int main() {
  int i;
for (i = 0; i < 3; i++)
{
  printf(".");
  fork(); }
}

Вопрос: сколько точек будет выведено в терминале?

 

Читатели, шлите нам свои решения!

Правильные ответы присылай или мне, или сразу представителю компании, Ольге Русаковой, на orusakova@parallels.com.

Степа Ильин

Главный редактор «Хакера» с 2012 по начало 2014 года. Сейчас с командой единомышленников строит компанию Wallarm, разрабатывающую решения для защиты веб-приложений от хакерских атак и обнаружения в них уязвимостей.

Теги:

10 комментариев

  1. http://vvoldemar.livejournal.com

    17.12.2014 at 00:32

    ВНИМАНИЕ, СПОЙЛЕР

    Поезд в 2 раз быстрее человека, например.

    Бежать надо вперед, четверть + четверть = половина пути ->поезд входит в туннель

    Ваш КО

  2. 18.12.2014 at 13:58

    2 Задача 2 варианта решения. Первый шаг у обоих вариантов одинаков козу на тот берег. А далее едем или за волком или за капустой.

    • 06.01.2015 at 14:38

      ты оставишь либо козу и волка, либо козу и капусту на конечном берегу и кто-то кого-то съест

      1)отправили козу
      2)отправили волка, а козу взяли обратно
      3)оставили козу на начальном берегу и взяли капусту
      4)вернулись за козой и переправили ее

  3. 16.01.2015 at 12:38

    2-я задача — бесконечно много решений, поскольку есть цикл.

    • 03.02.2015 at 08:19

      У второй задачи нормальных 2 решения по схеме которую описал stayakotov, во втором пункте можно брать или или. Коза единственная взаимодействует с двумя другими и её можно возить туда-сюда сколько угодно раз — но это даже не цикл -это петля называется — обмен пакетами по кругу. А реальных решений очевидно 2.

      Ну а первая задача 9 класс алгебры выразить неизвестные(скорости) через константу(время). Задача в 2 строчки, у меня получилось 1 к 11, т.е. В 11 раз (или для нудных ЕГЭшников НА 10 единиц скорости (задание очевидно ВО СКОЛЬКО, а не НА СКОЛЬКО,т.к. скорости человека мы не знаем и не с чем сравнить))

      • 21.02.2015 at 19:56

        Что-то у Вас с двумя строчками не то получилось. Вольдемар ведь правильно ответил. Вдвое. Смотрите: бежим назад- проходим четверть, а поезд проходит 2 четверти, бежим вперёд- проходим 3 четверти, а поезд- 6 четвертей. Задача явно линейная, так что решение- одно.

  4. 05.03.2015 at 13:21

    Вот тока человечик уже прошел 1/4 пути «…проходит четверть пути, слышит, что сзади…». Решается задачка в случае кольцевого движения.
    Вторую задачу решить легко при помощи комбинаторики и логики обычной человеческой (если волк съест козу, то коза не съест волка и т.п.). Вот как то примерно так!

Оставить мнение

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…