Тестовое задание в 2ГИС

Описание

Компания 2GIS занимается разработкой геоинформационных систем.
Задание на вакансию разработчика нового сервиса, аналогичного maps.me.

Характеристика задания:
  • Язык: C++.
  • ОС: Linux.
  • Год выполнения: 2015.
  • Срок выполнения: менее дня.
  • Результат: Задание прошло. На вакансию приняли другого человека, "который знает Qt".

Выводы

Перед тем, как послать задание, присылают PDF с вопросами по разработке.
Само задание не сложное и не требующее уймы времени и привлечения сил.
Интервью по Skype показало, что там вполне вменяемые и не самодовольные разработчики.

Краткое содержание

Напишите (консольную) программу, принимающую на вход  имя файла и набор параметров.
В зависимости от параметров программа должна работать в трёх режимах:

  1. test -f Test.tst -m words -v mother печатает количество слов «mother» в файле «Test.tst»
  2. test -f Test.tst -m checksum печатает 32-хбитную чексумму, рассчитанную по алгоритму checksum = word1 + word2 + … + wordN (word1..wordN – 32-хбитные слова, представляющие содержимое файла)
  3. test -h печатает информацию о программе и описание параметров.

При написании тестового задания мы ожидаем увидеть программу на языке С++ (а не «чистом» С), несмотря на некоторую избыточность С++ для данной задачи.

Документация и исходники

Размер: 24Kb
Загрузить

Тестовое задание в Coc-Coc

Описание

Coc-Coc - web-браузер для Вьетнама.
Некогда подразделение компании Nigma, компания Coc-coc разрабатывает свой браузер, захватывая рынок вьетнамо-говорящего населения.
Задание на вакансию C++ разработчика в г. Ханой.

Характеристика задания:
  • Язык: C++.
  • ОС: Linux.
  • Год выполнения: 2015.
  • Срок выполнения: около полутора-двух недель.
  • Результат: Программа повисла у них при проверке. Внятного ответа не дали.

Выводы

Изначально я написал однопоточную сортировку, которую затем переписал на многопоточный вариант, с использованием 11-го Стандарта.
Затем, переписал на свою многопоточную реализацию. После проверки несколькими компетентными программистами, компании где я работал, переписал на типовой ThreadPool.
Снова дал проверить. Оптимизировал. Стало работать быстро.

В итоге я получил:

  • Мой код они собрали старым компилятором, хотя было заявлено, что компилятор доступен любой.
  • Они использовали старый CMake, который не понял мой CMakeLists.txt. В итоге, им пришлось собирать всё руками.
  • В их сборке, на их сервере, по их утверждению, "программа зависла" (но на большем объёме данных, чем я проверял).
  • Мне был обещан технический отчёт.
  • Я получил одну строчку: "Your code is very complicated".

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

На то, чтобы удостоить меня ответом, они просто наплевали. Желание работать с этими людьми пропало.

Краткое содержание

We have 200Gb file filled with text lines divided by "\n".
Our server has Linux on board, gcc, 8Gb of RAM and at least 200Gb of free hard disk space.
Implement in C++ the most efficient way to sort this file from your point of view.
Program should accept input file name, output file name and memory limit as parameters (we will test with different memory limits, not only 8Gb). Obviously, your program should also be able to work correctly with simple boundary cases, e.g. with small files, empty files, files much bigger than 200Gb etc.

Конкретных ограничений по срокам выполнения задания нет.

Документация и исходники

Размер: 3.8Mb
Загрузить

Тестовое задание в NetUP

Описание

Компания NetUP занимается созданием систем биллинга и оборудования для IP TV.
Задание на вакансию C++ разработчика.

Характеристика задания:
  • Язык: C++ и JavaScript.
  • ОС: Linux.
  • Год выполнения: 2015.
  • Срок выполнения: менее недели.
  • Результат: По непонятной причине у них запрос не пришёл на сервер. На вакансию не приняли.

Выводы

Разработчик, после Skype интервью мне показался вполне нормальным человеком и специалистом.
Я сделал задание со всеми усложнениями.
С заданием я послал сопроводительное письмо примерно следующего содержания:
Некоторые замечания насчёт задачи:
  • Я писал дольше, чем планировал примерно на день: несколько увлёкся HTTP сервером.
    • Код не весь мой. Некоторую часть я просто адаптировал под свои задачи:
    • Базовый код работы с сокетами я адаптировал из какого-то примера на Pure C.
    • Потоковый буфер сделан по мотивам данной статьи.
    • Алгоритм поиска обратной матрицы взят с cyberforum.ru. Задача типовая, делать её скучно. Вариант с LU разложением не заработал, я не стал с ним разбираться и взял рабочий код для метода Жордано-Гаусса.
  • Да, получилось немного грязновато (можно было разбить HTTP сервер на несколько файлов, проверок больше сделать, отправку ошибки клиенту и т.п.).

При этом, фактически весь сервер написан мной, вся JS часть и полностью переписан алгоритм обработки матрицы.

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

Краткое содержание

Написать приложение, которое считывает из текстового файла данные квадратной матрицы произвольной размерности (например, от 1 до 10), производит вычисление обратной матрицы, и выводит результат на консоль.

Усложнение 1

Написать простой однопоточный HTTP-сервер, поддерживающий метод GET. При обращении с помощью веб-браузера к корневой странице сервера, должна выводиться форма в виде квадратной матрицы и кнопка Submit, при нажатии на которую должен формироваться GET запрос, результатом выполнения которого является веб-страница с рассчитанной обратной матрицей. Размерность вычисляемой матрицы (от 1 до 10), а так же хост и порт, на котором сервер принимает соединения, должны задаваться параметрами командной строки.

Усложнение 2

Усовершенствовать HTTP-сервер, добавив поддержку многопоточной обработки запросов с использованием библиотеки POSIX threads.

Выполненное задание должно содержать инструкцию по сборке и запуску в среде Linux с набором стандартных библиотек.

Документация и исходники

Размер: 544Kb
Загрузить

Тестовое задание в Astarta

Описание

Astarta занимается производством оборудования связи (систем телефонии и IP телефонии, шлюзов, цифровых коммутаторов).
Задание на вакансию C++ разработчика.

Характеристика задания:
  • Язык: C++.
  • ОС: Linux.
  • Год выполнения: 2015.
  • Срок выполнения: около трёх часов.
  • Результат: Программа принята с оценкой 4 из 5. На вакансию не приняли.

Выводы

Интересной особенностью данного задания было требование не переусложнять код.
Которое я благополучно нарушил, сделав для слов избыточный двусвязный список вместо односвязного.
Зачем я это сделал, не знаю. В результате, отладка работы со списком съела час-полтора времени, про что мне заметили: "Делал дольше, чем в среднем".
После выполнения задания его проверили, дали отчёт и заплатили за его реализацию 1000 рублей.
В целом, впечатление приятное.

Краткое содержание

Дано

Текстовый файл по фиксированному пути c:\list.txt состоящий из слов. Слово может состоять только из маленьких букв английского алфавита, всё остальное разделители. Размер слова не превышает 30 символов. Размер файла не ограничен (в том смысле, что нельзя заранее выделить массив слов).

Задача

Посчитать количество вхождения каждого слова в файле и напечатать результат парами (слово - количество) в отсортированном порядке. Сортировка слов по алфавиту.

Пример

Вход:
beep, astarta, color, beep

Выход:
astarta - 1
beep - 2
color - 1

Требования к коду

  • Язык с++
  • Считывание файла функциями: fopen(“c:\\list.txt”, “rt”), fgetc(), fclose()
  • Печать результата: printf()
  • Аварийный выход: exit(0)
  • Дополнительные функции: strlen(), strcmp()
  • Работа с памятью: new, delete
  • Использование других функций и каких-то специальных библиотек не допускается.
  • Комментирование кода достаточно самое минимальное.

Требования к алгоритму

  • Использовать простой линейный список, сделанный в ‘ручную’.
  • НЕ усложнять программу алгоритмами хеширования, оптимизацией скорости сортировки, выделением первой буквы и т.п. Проще – лучше.
  • Структура данных должна быть минимальна и заточена именно под эту задачу, то есть закладываться под потенциальное развитие программы НЕ нужно.
  • Подумать, КОГДА проще сортировать слова.

Критерии оценки

  • Качество и ‘красота’ исходного текста
  • Отсутствие алгоритмических ошибок
  • Отказоустойчивость (входные данные нарушают условия задачи)
  • Структурированность кода.
  • Время выполнения (обычно составляет 2 часа, но это не главное).

Документация и исходники

Размер: 24Kb
Загрузить

Тестовое задание в Swemel

Описание

Swemel занимается производством защищённых рабочих мест и систем терминального доступа.
Требуется это для государственных учреждений и различных ведомств.
Задание на вакансию C/C++ разработчика Linux.

Характеристика задания:
  • Язык: C++.
  • ОС: Linux.
  • Год выполнения: 2017.
  • Срок выполнения: около четырёх часов.
  • Результат: Задание принято. На вакансию не пошёл.

Выводы

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

В самой функции хэширования я что-то сделал не так, там проезд по памяти, видимо.

Суть ясна, дальше возможно сделать по-человечески, но времени много заняло (я пытался разбираться, как md5 и sha в glibc реализованы, плюс там ещё NSS используются).

Тесты не делал. Результат задания в виде патча.

Меня не пустили.

Приехал на собеседование, позвонил в Swemel, как сказали на пункте охраны. Мне ответила какая-то тётка с синдромом вахтёра, спросив: "Вы к кому?".
Я объяснил ей, что на собеседование по вакансии "Программист", к кому не помню, паспорт у меня с собой. На что она мне ответила: "Я вас не пущу, у меня тут программистов три этажа сидит". Я стал припоминать, что у вас в подписи было написано. Вспомнил, что вроде "Главный инженер, зовут Николай", фамилию не вспомнил. На что мне также было отвечено: "У меня Николаев три этажа, Главных инженеров у нас нет, я вас не пущу, да и вообще охрана не пустит". Я подождал минут пять на входе, понял, что нечего ловить и ушёл.

В целом, впечатление паршивое.
Я впустую скатался, потратив полтора часа времени и испортив настроение. Обещали "провести расследование".

Краткое содержание

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

Необходимо встроить в библиотеку glibc-2.23 любой простой алгоритм хеширования (например по аналогии с md5). Использование этого алгоритма представленно в файле test.c, алгоритм должен вызываться системной функцией crypt по идентификатору 'ba'.

Результатом выполнения тестового задания должен быть патч (diff -Naur test test_done) к директории test.

Документация и исходники

Размер: 19Mb
Загрузить