Не совсем характерная для меня тема устройства на работу, однако, разработчики часто интересуются тем, какие задания могут дать на собеседовании в качестве домашних. Действительно, иногда случается, что на собеседовании кандидат вроде как понравился, но чтобы быть уверенными в его навыках дается небольшое задание на дом, которое нужно решить за 2-3 дня (впрочем, случается, что дают и более сложные задания, но отводимое время редко превышает неделю).
Сразу скажу, что приведенная подборка заданий не претендует на какую-либо полноту. Стоит понимать, что в конкретной компании могут дать свое задание, да и фантазия собеседующих как правило безгранична. Однако цель всех таких заданий примерно одинакова - проверить ваше мышление, способность доводить дело до конца, знание ООП (в случае вакансии Java-программиста - особенно) и просто посмотреть какой код вы пишите.
Итак задания:
1. Поиск "похожих" файлов. В директории находятся текстовые файлы, заполненные какими-то произвольными словами. Мерой "похожести" считается совпадение количеств вхождения одного и того же слова в файл. Например, если в файле А слово "блог" встречается два раза и в файле Б это слово встречается 2 раза, то значит эти файлы в какой-то степени "похожи". Задача: сгруппировать файлы по "похожести" (файл А похож на Б, В, а файл Г, на К, Л, М и т.д.).
Задача предлагалась в компании "Кэпитал-АйТи" в 2007-м году.
При решении задачи следует обратить внимание на расширяемость. Какова будет сложность доработки вашего решения, если файлы будут браться не из каталога, а скачиваться по сети? Что будет, если файлов в директории более 100 000?
2. Морской бой с веб-интерфейсом. Реализовать игру "Морской бой". Играют два человека по сети. Необходимо реализовать веб-интерфейс, причем можно использовать любые средства (JavaScript/AJAX, JavaFX, Flex и т.д.). Правила игры стандартные за одним исключением: зона поражения не только тот квадратик, в который попал игрок, но и произвольное (случайное) количество соседних квадратиков.
Задача предлагалась в компании "Прикладные технологии" в 2009-м году.
3. Игра "Змейка". Игра всем знакомая и есть практически на каждом телефоне. Змейка под управлением игрока движется по экрану и пожирает предметы. С каждым сожранным предметом змейка растет и движется быстрее.
Задачу предложил Bishop.
4. Написать преобразователь данных из СУБД MS Access в MySQL. Необходимо написать приложение (в оригинале - PHP-скрипт), которое бы извлекало данные из файла MS Access и заливало бы их в базу данных под управлением MySQL. Задание отличается от обычно предлагаемых тем, что оно не абстрактно. Соответственно, его решение в то время оплачивалось.
Задача предлагалась в интернет-агентстве "Dextra" в 2005-м году.
5. Клиент-серверное приложение. Клиент раз в 10 секунд должен отправлять на сервер по протоколу TCP какие-то данные (например, нарастающий номер пакета и время). Сервер должен в отдельном потоке запускать обработчик, который эти данные получает и записывает в лог-файл. Результат обработки (удачно/нет) - отправить обратно клиенту. Требуется предусмотреть ротацию логов сервера с периодом 1 минута.
Задача предлагалась в качестве тестовой для Python-программистов. Обсуждение здесь.
6. Редактор иерархического списка с гибкими атрибутами. Существует некоторая иерархия (например, документов). Необходимо написать редактор данной иерархии с веб-интерфейсом, позволяющий добавлять новые документы, редактировать и удалять существующие, изменять порядок следования документов в иерархии. Редактор должен позволять изменять родительский элемент и перемещать объекты по иерархии. Каждому объекту можно назначать дополнительный набор т.н. гибких атрибутов, т.е. атрибутов. не "вшитых" при реализации, а назначаемых пользователем. Список типов атрибутов следующий: строка, число, дата, дата-время, файл, ссылка на другой объект в иерархии.
При решении следует обратить внимание на расширяемость: как легко добавить новый тип атрибута? Какова будет производительность решения, если объектов будет 1000, 10 000, 100 000? Если у каждого объекта будет по 10, 100, 1000 атрибутов?
Так же данное задание интересно тем, что его можно решать ради саморазвития при знакомстве с новым языком/парадигмой программирования. Рекомендую.
Задача пока нигде не предлагалась.
7. Утилита сравнения файлов. Произвести сравнение двух файлов Excel и дополнить один данными из другого (файлы отличаются только данными. структура одинаковая).
За задачу спасибо Виктору Аленькову.
8. Гостевая книга. Данную задачу редко конкретизируют. Предлагается она как правило в небольших веб-конторках при тестировании кандидата на позицию PHP-разработчика.
За задачу спасибо Александру Шуйскову.
9. Поисковик с хранением данных в реляционной БД. Задача предлагалась в 2009-м году в компании ACS. Само задание никак не конкретизировалось.
За задачу спасибо Александру Шуйскову.
10. Двухуровневый кэш объектов. Разработать двухуровневый кэш для кэширования объектов типа Object. Первый уровень - в памяти, второй - в файловой системе. Реализовать возможность конфигурацией задавать размер и стратегии уровней кеша.
За задачу спасибо пользователю Roman.
11. Электронная таблица. Необходимо реализовать простую электронную таблицу в виде программы, выполняющейся из командной строки. Она должна уметь обрабатывать ячейки таблицы как и более продвинутые аналоги, только с упрощенным синтаксисом выражений. Подробнее - здесь.
По словам первоисточника, с этой задачей в одной конторе не справился ни один из тех, кому ее давали. Точнее, не справился в полном объеме. После более или менее успешного ее решения проводилось интервью. Задача использовалась для выявления потенциальных архитекторов.
Ссылку на задачу прислал Евгений Охотников.
12. Утилита для работы с лицензионной информацией в файлах исходных кодов. Необходимо реализовать утилиту, которая будет помещать в файлы исходного кода лицензионную информацию (копирайты), редактировать ее и при необходимости удалять. Более подробно условие задачи изложено здесь.
При решении следует обратить внимание на полное понимание условия задачи. Там есть маленький подвох.
За ссылку на задачу спасибо пользователю Skynin. Автор задачи - Евгений Охотников.
13. Реализовать полное двоичное дерево (full binary tree) на Java с набором методов таких, как добавление, удаление, перемещение, поиск элементов. Задача предлагалась в компании Global Logic. За ссылку на задачу спасибо пользователю Antony.
14. Примитивный веб-браузер. Написать функцию, которая на вход принимает текст HTML-страницы, а на выход выдает ее, отрисованную в GIF картинку. Задача предлагалась в компании EPAM. За ссылку на задачу спасибо пользователю SvetLana.
15. Клиент к Digg.com. Разработать приложение, которое позволяет конечному пользователю в разном виде просматривать сто популярных новостей с digg.com. Данные о новостях можно получить в формате JSON по адресу http://services.digg.com/1.0/endpoint?method=story.getPopular&type=json&count=100.
В веб интерфейсе приложения должна быть возможность сортировать новости в хронологическом порядке и по-популярности (diggs, количество комментариев), отфильтровывать новости по темам (topic и container), а так же читать полный текст новости.
При разработке использовать свободное или бесплатное ПО.
Задача взята с форума JavaTalks.ru.
16. Чат-сервер с клиентом. Простенький консольный чат-сервер с клиентом.
Функциональные требования:
1) Система подразумевает наличие двух компонентов: серверного приложения и клиента.
2) При запуске клиента автоматически происходит новое соединение с сервером (регистрация нового пользователя):
a. адрес сервера берётся из параметров запуска;
b. "ник" берётся из параметров запуска.
3) Клиент – это консольное приложение.
a. При запуске показывает, к какому серверу подключился (адрес);
b. По нажатию Enter отправляет введённую строку на сервер;
c. Всё что приходит от сервера, сразу выводится в консоль;
d. Если сервер прекращает работу или отсоединяется (сеть пропала), клиент должен написать сообщение и завершить работу;
e. Если введена команда "bye", клиент должен отослать эту команду на сервер, отсоединиться от сервера и прекратить работу.
4) При остановке клиентского приложения сервер должен понимать, что клиент отсоединился («ник» уходит в оффлайн).
5) Серверное приложение запускается и останавливается в ручном режиме.
a. Сервер ведёт примитивный лог: "ник" такой-то зарегистрировался, "ник" ушёл в оффлайн. Сервер ведёт этот лог в свою консоль;
b. Сервер понимает три команды от клиентов:
1. list – показывает список пользователей со статусами (онлайн, оффлайн).
2. kick nick message – показывает указанному пользователю сообщение и отключает его.
Пример: kick vanya Бан на два часа
3. bye – показывает прощальное сообщение от пользователя.
Пример: bye Всем чмоки в этом чате!!!!
c. Всё что не команды, сервер пересылает всем подключенным пользователям – это функциональность чат-сервера.
Требования к платформе реализации, технологиям и инструментам:
1) Код должен быть оформлен в Eclipse 3. Язык программирования – Java 5
2) Используем Java NIO Non-blocking API для работы с сетью.
3) Приложение должно обрабатывать исключения, которые могут возникнуть в его работе.
4) Сервер должен работать в двух потоках:
a. Первый поток обрабатывает все, что связано с сетью – socket accept, read, write. То есть, первый поток просто вычитывает данные и отдаёт второму потоку без обработки.
b. Второй поток работает с данными, полученными из сети, и отдаёт в первый поток данные для отправки.
Требования к коду:
1) Исходный код должен содержать комментарии для классов и ключевых методов классов, объясняющие цели, задачи и нюансы реализации класса/метода.
2) При сборке проекта, компилятор не должен выдавать серьёзных замечаний (warnings).
3) Структура проекта должна подразумевать наращивание функционала в дальнейшем.
4) Наименование переменных, классов и методов, должно следовать стандартам, рекомендуемым для языка Java.
Требования к поставке:
1) Исходный код в виде проекта, который можно загрузить и запустить в Eclipse.
2) Желательно предоставить краткую инструкцию, как запускать приложения.
Задача взята с форума JavaTalks.ru.
Если вам интересно мое личное отношение к домашним заданиям после собеседования, то оно резко отрицательное. С большой долей вероятности я не буду решать задачу, если только она не покажется мне очень интересной. Считаю, что у меня есть некоторый опыт программирования, рекомендации, блог. Мой код можно посмотреть в проектах с открытым исходным кодом (в том числе и в Eclipse Communication Framework). Считаю, что стоит ценить время не только свое, но и собеседуемого.
Однако, если вы - начинающий программист и вам предлагают задание после собеседования, то вас можно поздравить: на вас обратили внимание. Если вы еще и решите предложенную задачу даже не идеально, то скорее всего вас примут на работу.
З.Ы. Данный список будет пополняться. Расскажите в комментариях какие задания вы предлагаете претендентам на работу в вашей компании, а также какие задачи предлагали вам, а я добавлю их в список с указанием авторства.
Понравилось сообщение - подпишитесь на блог или читайте меня в twitter
16 комментариев:
по аналогии со 2-й, в своё время делал полный аналог игры "Сапер" на Delphi (какому-то студенту халтурил :) )
А так же из собственного опыта:
1) (на delphi) произвести сравнение 2-х файлов Excel и дополнить один данными из другого (файлы отличаются только данными. структура одинаковая)
2) (на Lotus Notes/Domino) в БД сделать сделать сущности "карточка сотрудника" с вложенной фотографией. возможность её показа в клиенте и редактирования (удалить, заменить). особенность - предусмотреть хранение фотографии в отдельном документе
Да, забыл уточнить.
первая была "тестовой задачей" на испытательном сроке, а не на этапе собеседования.
а вторая вообще была "устной" - работодателя интересовал подход к решению, а не само решение :)
По поводу рекомендаций и кода в ECF - хороший вариант "решите вот эту задачу, или покажите свой код".
Хотя один принёс свой код, а на вопросы "а почему так странно сделано" отвечал, что этот код ему достался по наследству.
Я вот не могу оценить человека без того, чтобы посмотреть его код.
PS: из опыта общения с кандидатами после- код показывает не только профессиональные качества, но и личные.
>> Код показывает не только профессиональные качества, но и личные.
Это конечно верно, просить показать код можно и нужно. Но опять же показать код, а не решить эту конкретную задачу. Другое дело, что у претендента может не быть кода, тогда да - нужно дать какую-нибудь задачку. Но, опять же, давать задачу на неделю - это, ИМХО, перебор.
Java. Разработать двухуровневый кеш для кеширования объектов типа Object. Первый уровень в памяти, второй в файловой системе. Реализовать возможность конфигурацией задавать размер и стратегии уровней кеша.
А вот тут еще есть, для коллекции:
Тестовое задание, которое я давал кандидатам на должность C++ программиста
Всем спасибо за задачи! По возможности добавляю в основной список.
Мне понравилась задача "problem K", которую, afaik, использовали в CQG. Оригинальное описание в блоге Сергея Зефирова и она же на HaskellWiki.
Как-то подбирал себе коллег ))) По мотивам пункта 6. http://sql.ru/forum/actualthread.aspx?tid=452971
Считаю неплохим тестом, поскольку с одной стороны относительно прост, а с другой стороны требует конкретных навыков и знаний.
По крайней мере 2 человека прошли этот маленький тест и я ни разу не разочаровался в их квалификации.
если давать условные тестовые задания, можно при их разработке ориентироваться на позиции в матрице компетентности девелопера. http://omega-it.blogspot.com/2008/07/i.html
Собственно в тестовом задании интересно посмотреть не столько на само решение, сколько на оформление претендентом кода. А вообще, среди задач есть несколько интересных. Только вот №5 в варианте на twisted на задание никак не тянет, там работы от силы на 20 минут.
Ну если цель - посмотреть как программист оформляет и вообще пишет код, то, я думаю, тянет.
@Antony Большое спасибо за задачу.
З.Ы. Не стесняемся, добавляем задачи в комментариях.
В компании EPAM Systems для того, чтобы попасть на стажировку, просят выполнить следующее задание (на Java): написать функцию, которая на вход принимает текст HTML страницы, а на выход выдает ее отрисованную в GIF картинку.
Мне такое предлагали: "Create a configurable two-level cache (for caching Objects). Level 1 is memory, level 2 is filesystem. Config params should let one specify the cache strategies and max sizes of level 1 and 2."
Решение
Лучше поздно чем насовсем. Перенес новые задачи в текст поста. Большое спасибо всем комментаторам. Если у вас, уважаемые читатели, есть еще интересные задачи - пожалуйста поделитесь ими.
Отправить комментарий
Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!