13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
1

Тестовое задание от компании ИНКОМА (Senior Software Developer C++ (Qt)

29.01.2020, 22:38. Показов 3868. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня вопросы к профессиональному сообществу: Как относится данному работодателю ?
Отправил сврё резюме и в качестве условия для собеседования мне выслали тестовое задание.
Я правильно понимаю что мне будет дано право решать хочу я тут работать или нет только после успешно выполненного тестового задания ?
Само тестовое задание тоже вызывает вопросы. Возможно у меня нехватает опыта, а возможно не умеют формулировать мысли.
Непонятный места помечены жирным шрифтом. В описании требований вакансии вообще ничего не сказано про опыт разработки клиент-серверных приложений. Я сам раньше сервера не разрабатывал и мне сам объём задания кажется запредельным.

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

Что имсеется ввиду тут непонятно вообще.
Соотношение операций чтение/запись = 90/10.
Ну остальные непонятки в тексте ниже?
Кликните здесь для просмотра всего текста
Решение необходимо оформить в виде ссылки на GitHub на приватный доступ. Для того нужно зайти в настройки профиля -> Repositories -> Collaborators, рядом с тем репозиторием, к которому хотите дать доступ, в строке поиска ввести e-mail: romed2403@gmail.com. Появится аккаунт RomanED.


Задание 1

Класс описан следующим образом:

class SomeClass
{

public:
SomeClass()
{
x1 = new char[ 1024 ];
x2 = new char[ 1024 * 1024 ];
}

private:
char *x1;
char *x2;
};

Опишите и исправьте проблемы (если они есть) в этом классе и приведите код для конструктора копирования и оператора присваивания(а также оператор перемещения и конструктор перемещения).


Задание 2


У вас есть серверная компонента, в которой есть некий объект (например контейнер STL) из\в которого производятся конкурентные (из нескольких потоков) чтение и запись клиентами, которые подключились к этому серверу.

Соотношение операций чтение/запись = 90/10.

Реализуйте клиент-серверный механизм взаимодействия (используя Boost и\или Qt).

Допустим у вас есть 10 клиентов (реализация клиента проста, может отправлять запросы, а также выполнять ожидание на reconnect и т.д., список запросов можете сделать как вам удобно, но чем больше разных состояний и граничных случаев будет учтено, тем лучше), каждый из которых подключились по соответствующему порту и адресу к серверу. Сервер имеет в качестве структуры данных какой то контейнер STL, например unordered_map (либо это может быть база данных SQL или любая другая).

Запись и чтение в этот контейнер должны производиться конкурентно. Сам сервер должен, в случае если нагрузка нормальная, ответить на запрос клиента при попытке установки соединения, если занят то ответить что нибудь типа Busy, и через некоторое время попытаться соединиться снова. После установки соединения, клиент (можно генерировать тип запроса "чтение" или "запись", в любой последовательности в примерном соотношении 90\10 как указано выше), начинает отправлять запросы на чтение или запись в контейнер сервера (или базу данных). Можно вкратце описать выбор протокола передачи UDP или TCP, преимущества и недостатки, а также, если невозможно использовать какой либо из них при решении данной задачи.

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

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

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

Что для решения можно использовать:

С++11\14\17
Boost
Qt

Как будет оцениваться задача:

ООП составляющая(применение паттернов, то как это спроектировано, применение SOLID и тд).
Качество кода(правильное использование конструкций и возможностей языка С++, STL и фреймворка Qt).
Наличие бенчмарка (запись результатов скорости выполнения, оценка сложности).
Правильность выбора структуры данных при решении данной задачи (относится к предыдущему, провести анализ вычислительной сложности).
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2020, 22:38
Ответы с готовыми решениями:

Тестовое задание от компании Exness
У меня нет никакого вопроса, но я так и не понял в какую ветку надо написать (все изучил...

Небольшое тестовое задание в финской компании.
Привествую всех жителей форума. Сразу отмечу, что решения просить не хочу, а просто хочу показать...

Senior Software Developer C++(Симферополь)
Для реализации новых коммерческих проектов требуется опытный программист-разработчик системного и...

Senior Software Developer C++ [CQG, Zelenograd]
Вакансия: Ведущий Программист-Разработчик C++ (Win) Регион: Зеленоград (Москва) ...

33
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
29.01.2020, 22:57 2
Цитата Сообщение от squareroot Посмотреть сообщение
Соотношение операций чтение/запись = 90/10.
Из 100 операций 90 - чтение, 10 - запись.

Цитата Сообщение от squareroot Посмотреть сообщение
После установки соединения, клиент (можно генерировать тип запроса "чтение" или "запись", в любой последовательности
Клиент, например рандомно, может выбирать в каком порядке выполнять данные запросы, но в пределах заданного соотношения.
Пример запроса записи, например, это как INSERT INTO в SQL,
Пример запроса чтения, например, это как SELECT FROM в SQL.
Привожу эти примеры. т.к. в задании была упомянута база данных.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
29.01.2020, 23:08  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Из 100 операций 90 - чтение, 10 - запись.

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

Цитата Сообщение от DrOffset Посмотреть сообщение

Клиент, например рандомно, может выбирать в каком порядке выполнять данные запросы, но в пределах заданного соотношения.
Пример запроса записи, например, это как INSERT INTO в SQL,
Пример запроса чтения, например, это как SELECT FROM в SQL.
Привожу эти примеры. т.к. в задании была упомянута база данных.
Т.е. нужен какойто продвинутый протокол прикладного уровня, в котором чтение и запись между клиентом и сервером не означает запись чтение из Б.Д. ? И этот продвинутый протокол надо самому реализовать ?
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
29.01.2020, 23:13 4
Цитата Сообщение от squareroot Посмотреть сообщение
производятся конкурентные (из нескольких потоков) чтение и запись клиентами, которые подключились к этому серверу.
Ну клиенты здесь могут быть каждый в своем потоке, либо могут использовать thread pool`ы для выполнения своих заданий. Второе в целом предпочтительнее, при большом числе клиентов.
В любом случае, в задании хотят, чтобы в процессе выполнения этих заданий данные записывались или считывались из какого-то общего ресурса.

Добавлено через 1 минуту
Цитата Сообщение от squareroot Посмотреть сообщение
Ничего не понял. Клиент может читать, когда сервер пишет и наоборот, но прежде клиенту и серверу надо договарится кто в какой последовательности будет читать и писать. и система может склеивать несколько отправленных пакетов при чтении. И как тут такое соотношение должно выдерживаться ?
Да тут речь не о записи\чтении в сокеты\из сокета. А о ЗАПРОСЕ чтения\записи.

Добавлено через 2 минуты
Цитата Сообщение от squareroot Посмотреть сообщение
Т.е. нужен какойто продвинутый протокол прикладного уровня, в котором чтение и запись между клиентом и сервером не означает запись чтение из Б.Д. ? И этот продвинутый протокол надо самому реализовать ?
Ну протокол прикладного уровня нужен в любом случае. Продвинутый или нет, дело десятое.
Да, в этом протоколе, очевидно, должны быть два типа пакетов от клиента. Пакет с запросом "ЧТЕНИЕ" и пакет с запросом "ЗАПИСЬ". Отправленный клиентом пакет "ЧТЕНИЕ", приводит к тому, что в результате клиент получает ответ от сервера с данными из упомянутого выше общего хранилища.
Пакет "ЗАПИСЬ", приводит к тому, что в общее хранилище на сервере добавляются новые данные.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
29.01.2020, 23:18  [ТС] 5
DrOffset, Я всё понял, но мне интересно такого объёма тестовое задание все дают ?
Даже если гдето скомуниздю протокол прикладного уровня. Ну Boos.Beast возьму. Это как не многовато для тестового задания ?
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
29.01.2020, 23:37 6
Цитата Сообщение от squareroot Посмотреть сообщение
Я всё понял, но мне интересно такого объёма тестовое задание все дают ?
Нет, но я думаю это обусловлено тем, что речь идет о
Цитата Сообщение от squareroot Посмотреть сообщение
Senior Software Developer
Хотя, я как человек, который тоже постоянно участвует в отборе кандидатов, все-таки предпочел бы "задушевный" разговор с потенциальным сеньером, чем загружать его тестовым заданием. На мой субъективный взгляд, если давать сеньерам задания, то они должны быть оплачиваемые.

Добавлено через 5 минут
squareroot, в принципе задание довольно простое. Если писать с использованием готовых библиотек, то за пару дней, если вы в теме, точно напишете. Вам там разрешили Qt, в Qt есть все, что нужно для выполнения. Если затруднение конкретно в прикладном протоколе, то есть QDataStream, он обеспечит требуемую сериализацию для формирования пакетов между клиентом и сервером.

С другой стороны, не вижу в этом задании ничего такого, чего нельзя было бы выяснить в личной беседе.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 00:03  [ТС] 7
DrOffset, На Qt писал даже когдато игрушечный сервер, но очень давно из с QDatastream много шишек поимел прежде чем понял как с ним обращаться.
Но сервер на QT выглядит детскй игрушкой, а тестовое задание это в некотором роде конкурс.
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 01:25 8
Цитата Сообщение от squareroot Посмотреть сообщение
Но сервер на QT выглядит детскй игрушкой, а тестовое задание это в некотором роде конкурс.
Это странное утверждение в контексте того, что вам в задании черным по белому разрешили использовать Qt.
И я по своему опыту хочу сказать, что со стороны работодателя грамотнее будет оценивать не конкретные инструменты, которые вы применили, а то как вы их применили и какие концепции реализовали. Это раскроет, насколько полно вы чувствуете тему. Нельзя основным критерием ставить то, что QTcpServer - это игрушка, а, например, asio::ip::tcp::acceptor - нет. Это во-первых просто некорректно в отрыве от реальных требований, во-вторых ничего не говорит о качестве решения. Само по себе использование asio вместо Qt не делает ваш сервер профессионально написанным.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 01:36  [ТС] 9
DrOffset, Я пока не нахожу подтверждения что в Qt как в Греции есть всё
Погуглил и не нашёл парсера какого нибудь протокола прикладного уровня. Вы наверно знаете больше меня тут.
Мне если честно совсем душа не лежит писать самому парсинг, хотя это несложно.
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 01:40 10
squareroot, простите за бестактный вопрос, но вам точно сейчас нужно связываться с позицией Senior Developer?

Добавлено через 22 секунды
Какой у вас опыт в разработке ПО?
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 04:37  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
squareroot, простите за бестактный вопрос, но вам точно сейчас нужно связываться с позицией Senior Developer?

Добавлено через 22 секунды
Какой у вас опыт в разработке ПО?
По данной позиции может и не стоит.
Опыта много, но не в серверах.

Добавлено через 13 минут
DrOffset, Щас вообще мало работы по теме C++. А ещё каждый работодатель ищет специалиста по своему чень узкому направлению. Но невозможно быть специалистом во всех узких направлениях.

Добавлено через 20 минут
Но вообще тема интересная.

Добавлено через 2 часа 19 минут
DrOffset, Может Вы хотите сами чтото предложить, чтоб не связываться мне с этой позицией ?
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 05:22 12
Цитата Сообщение от squareroot Посмотреть сообщение
Может Вы хотите сами чтото предложить, чтоб не связываться мне с этой позицией ?
В смысле работы? Нет, я таким образом рекрутингом не занимаюсь. И у этой компании вашу кандидатуру отнимать не собирался.
Задание хорошее, интересное. Не каждый сеньер стал бы его делать - это факт. Время хорошего специалиста стоит денег.
А вам я просто хотел предложить самому оценить, потянете ли вы сеньера в плохознакомой области.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 05:32  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
В смысле работы? Нет, я таким образом рекрутингом не занимаюсь. И у этой компании вашу кандидатуру отнимать не собирался.
Задание хорошее, интересное. Не каждый сеньер стал бы его делать - это факт. Время хорошего специалиста стоит денег.
А вам я просто хотел предложить самому оценить, потянете ли вы сеньера в плохознакомой области.
Помоему Синьоры и несиньоры это вопрос текущего момента. Столько раз сталкивался что в вакансии написано одно, а на самом деле всё иначе.
Когда у компании нету срочной потребности в кадрах они ставят вакансию супер пупер синьора типа наглухо закрывают свой рекрутинговый файервол и по большому счёту никого не ждут.
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 05:48 14
squareroot, я не делаю никаких оценок, просто факты.
Вы пишете
Цитата Сообщение от squareroot Посмотреть сообщение
Senior Software Developer
Цитата Сообщение от squareroot Посмотреть сообщение
Я сам раньше сервера не разрабатывал и мне сам объём задания кажется запредельным.
Наверное это как-то коррелирует, нет?

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

Я могу вам точно сказать, что это задание на самом деле на миддла.
Да, возможно потребует некоторого количества писанины, время на которую не у всех есть. Но по своей сути задание очень простое. Это, кстати носит и некоторый позитивный момент. Можно с уверенностью сказать, что в данном случае компания не стремится бесплатно засчет кандидатов порешать свои проблемы (собрать N решений какой-то своей проблемы и выбрать лучшее), а такое бывает.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 05:55  [ТС] 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Я могу вам точно сказать, что это задание на самом деле на миддла.
Да, возможно потребует некоторого количества писанины, время на которую не у всех есть. Но по своей сути задание очень простое.
Ну давайте прикинем объём работ , ок ?
Написать и отладить сетевую часть сокеты, шмокеты, причём что сервер был многопоточный. Интересно отсутствие балансировки это непростительная ошибка ?
Придумать протокол прикладного уровня или взять за основу готовый. Написать кодер/днеодер для него.
Потом всякая там межпоточная синхронизация, адрессация! так как надо клиентам както обозночаться.
Плюс всякие логгеры, бенчмарки.
И на всё 2 дня ?
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 06:03 16
Цитата Сообщение от squareroot Посмотреть сообщение
Написать и отладить сетевую часть сокеты, шмокеты, причём что сервер был многопоточный ?
В Qt готовая инфраструктура. И для сети и для потоков.

Цитата Сообщение от squareroot Посмотреть сообщение
Придумать протокол прикладного уровня
Протокол надо придумать, да. Но объем информации маленький, значит и протокол может быть простой.

Цитата Сообщение от squareroot Посмотреть сообщение
Написать кодер/днеодер для него.
Сериализация\десериализация есть в Qt.

Цитата Сообщение от squareroot Посмотреть сообщение
Потом всякая там межпоточная синхронизация, адрессация! так как надо клиентам както обозночаться.
Синхронизируется только доступ к хранилищу. В задании разрешили использовать базу данных. В комплекте с Qt идет SQLite, например. Вся инфраструктура готовая.

Цитата Сообщение от squareroot Посмотреть сообщение
Плюс всякие логгеры
QMessageLogger.

Добавлено через 1 минуту
Цитата Сообщение от squareroot Посмотреть сообщение
бенчмарки.
Ну уж бенчмарк-то напишете, надеюсь
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 06:24  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
В Qt готовая инфраструктура. И для сети и для потоков.
Это готовая инфраструктура требует несколько тысяч строк кода Вот такая она готовая.

Цитата Сообщение от DrOffset Посмотреть сообщение
Протокол надо придумать, да. Но объем информации маленький, значит и протокол может быть простой.
Сериализация\десериализация есть в Qt.
Протокол действительно сложный не нужен, но нужно написать кодеры декодеры. Привинтить эти кодеры/декодеры к сетевой части.
И если сетевая часть отлажена не очень хорошо, то потом ошибку можно искать несколько дней. А заставить работать многопоточный сервер как автомат калашникова дело небыстрое. Я когда писал Qtшный сервер столько проблем поимел. То в буфере сокета данные не полные (а комплиторов как в бусте там нет), то QDarastream не очищается. И сериализация тут погоды не делает надо какойто эффективный парсинг придумать, а быстро можно придумать только какуюто лажу. Готовый парсинг хотел взять потомучто не был уверен что смогу сходу придумать луший вариант, а не потомучто это сложно.

Цитата Сообщение от DrOffset Посмотреть сообщение
Синхронизируется только доступ к хранилищу. В задании разрешили использовать базу данных. В комплекте с Qt идет SQLite, например. Вся инфраструктура готовая.
Нсли брать SQL, то надо или усложнять протокол прикладного уровня и тогда он не такой простой или самому писать запросы.
Формировать структуру Б.Д. Тоже протестировать что всё работает. Само по себе это ерунда, но когда таких вот...
Цитата Сообщение от DrOffset Посмотреть сообщение

QMessageLogger.
Опять надо написать отладить.

Цитата Сообщение от DrOffset Посмотреть сообщение
Ну уж бенчмарк-то напишете, надеюсь
QMessageLogger.
Могу, но не хочу. Потомучто делать зорошо - долго, а делать плохо - себя выставлять в невыгодном свете. Лучше взять чужле.
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.01.2020, 06:30 18
squareroot, я не считаю, что вы правы в своей оценке, но переубеждать не буду. Дело это неблагодарное.

Вообще понятно: вы такое не писали раньше всерьез. Однако это задание для тех, кто писал. Вот и вся разница. Все ваши трудности от этого.
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
30.01.2020, 06:37  [ТС] 19
Те кто пишут это всерьёз. Пишут сначало говнокод, потомучто когда проект только стартует начальство нервничает, ему надо отчитываться.
Потом это всё выкидывают и пишут заново но уже не спеша с растоновкой.
фрилансер
5491 / 5089 / 1045
Регистрация: 11.10.2019
Сообщений: 13,313
30.01.2020, 07:57 20
Цитата Сообщение от squareroot Посмотреть сообщение
Но сервер на QT выглядит детскй игрушкой,
Qt не накладывает никаких ограничений на производительность. А также не запрещает использовать винапи/буст напрямую, хотя это там и не требуется. Относись к Qt как к языку C++, потому что это на самом деле так и есть
30.01.2020, 07:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2020, 07:57
Помогаю со студенческими работами здесь

Senior Software Web Developer (PHP), $2000, Kiev
Известной студии Web-дизайна в связи с открытием ряда крупных международных проектов требуется на...

Senior Software Developer (Cloud Core Services) СПб от 90000р
Резюме направлять на job@dins.ru Требования: Опыт командной работы. ...

Вакансия Senior C++Developer,Senior J2EE Developer, Украина, г.Николаев
С++ Required skills: Good understanding of OOP principles, design patterns and their...

Уровень программиста (Junior Developer, Middle Developer, Senior Developer), как проверить?
Доброго времени суток. Какие есть тесты для проверки своего уровня программирования(может на хабре...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru