LINUX.ORG.RU

На что обращают внимание в тестовых заданиях на С++?

 


3

5

Сейчас нахожусь в поисках работы. Один из языков, который у меня указан в резюме это С++. Не разрабатывал на нем уже 4-5 лет, но базовые знания не должны были пропиться. :) Столкнулся с тем, что сейчас любят давать тестовые задания на дом, в которых нужно написать tcp клиент/сервер. Задания довольно простые, типа клиент отправляет раз в секунду число на сервер, сервер делает с ним некую манипуляцию и отсылает обратно клиенту. Сервер должен поддерживать множество клиентов, клиентский интерфейс не должен фризиться, в общем стандартный набор требований. Выслали мне одно такое задание, написал, отправил им. И тут приходит ответ - «К сожалению, по результатам реализации тестового задания, мы не готовы предложить вам дальнейшее участие в конкурсе на замещение данной позиции.» Я как минимум рассчитывал на то, что второй раунд быть был обязан. Главное понять не могу, что им не понравилось. Приложение требованиям соответствует, не падает, архитектура вроде не говеная - стандартная, warning-ов нет, в сроки уложился, написано на Qt. Сейчас делаю подобное задание для другой конторы и думаю как бы не вляпаться снова. Есть тут спецы по подобным тестам? Ссыль на выполненный тест

Тест полного задания: Необходимо создать клиентское и серверное приложения с помощью C++ и Qt

1. Сервер: по заданному порту, принимает соединения по TCP от клиентов. В случае если приходит число, умножает его на 2 и возвращает значение клиенту. Поддерживает «неограниченное» количество подключений.

2. Клиент: Запрашивает у пользователя адрес сервера, порт и диапазон чисел, с помощью GUI. Присоединяется к серверу и посылает ему в цикле случайное число из диапазона. В окне выводит информацию о том, какое число было послано и какое было получено. После чего ждет 1000мс и посылает следующее. Часть, занимающуюся коммуникацией по TCP, необходимо выполнить в отдельном потоке.

Сейчас нахожусь в поисках работы. Один из языков, который у меня указан в резюме это С++

Не разрабатывал на нем уже 4-5 лет

зачем тогда его указывать в резюме?.. в резюме не надо указывать все, что ты видел и дышал за свою скромную жизнь, а указывать то, на каком «стеке» ты будешь работать

umren ★★★★★ ()

Главное понять не могу, что им не понравилось. Приложение требованиям соответствует, не падает, архитектура вроде не говеная - стандартная, warning-ов нет, в сроки уложился, написано на Qt.

много разных факторов бывает, например забыли закрыть вакансию, а ты вхолостую писал тест, не обязательно вина с твоей стороны, факапы и внутренние часто бывают

umren ★★★★★ ()
Ответ на: комментарий от umren

Ну так говорю же, не пропил это знание до конца. Меня на прошлую работу именно за хорошее знания С++ взяли. Единственно сейчас стандарт далеко ушел и мне нужно время, чтобы наверстать, но в том задании ничего из нового стандарта не требовали. Но по мелочам я его использовал, типа лямбд и std::thread.

Booster ★★ ()
Ответ на: комментарий от umren

Не похоже. Чтобы в этом случае написать, что мое решение фуфло, это надо быть не в себе.

Booster ★★ ()
Последнее исправление: Booster (всего исправлений: 1)

Исключения ловятся по значению. Надо по ссылке.

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

Очевидно, ты раньше не имел с этим дело. Копай в сторону thread pools и epoll (или что там под виндами). Можешь даже посмотреть как это делается в boost asio.

rupert ★★★★★ ()
Ответ на: комментарий от rupert

Ну и что что-то по значению, они простые и оверхед незначительный.

Насчет потоков, возможно это близко к истине. Я действительно с серверами дела не имел. В сервере Qt используется QRunnable. Можно вкратце про thread pools?

Booster ★★ ()
Ответ на: комментарий от qulinxao

текст полный задания процитировать в стартовом посте возможно?

Done.

Поддерживает «неограниченное» количество подключений.

Да, скорее всего я на этом и погорел.

Booster ★★ ()

Главное понять не могу, что им не понравилось.

позвоните им и спросите. телепаты в отпуске.

next_time ★★★★★ ()

Ну так по коду на вскидку лучше не наследоваться от QThread, это объект потока, а не сервер в отдельном треде. Да и мешать винапи с кутями тоже странно, можно же было на кутях целиком и сервак запилить. При некотором небольшом напилинге можно запилить сигнал слоты на указателях на функцию-член.

Gorthauer ★★★★★ ()

В случае если приходит число,

что делает сервер если приходит не_число?

qulinxao ★★☆ ()
Ответ на: комментарий от umren

зачем тогда его указывать в резюме?.. в резюме не надо указывать все, что ты видел и дышал за свою скромную жизнь, а указывать то, на каком «стеке» ты будешь работать

Ой какой бред..

UVV ★★★★★ ()
Ответ на: комментарий от Booster

Ну и что что-то по значению, они простые и оверхед незначительный.

Тем не менее, так не принято.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от Booster

Ну и что что-то по значению, они простые и оверхед незначительный.

Что простите?

UVV ★★★★★ ()

Виндовозненько...

А почему сервера два? Тот, что на Qt, насколько я вижу, использует QThreadPool и QRunnable, зачем второй? Мусор какой-то ещё кругом разбросан... Вообще, если бы ты дал ссылку на гитхаб, было бы в 100500 раз приятнее.

Поддерживает «неограниченное» количество подключений.

А что это такое «неограниченное» они как-то расшифровывают? Так это выглядит как неверифицируемое требование, что указывает на непрофессионализм постановщика задачи. Конечно же 1 поток на соединение может так же подходить под это требование, как и другие решения. Вот если бы они задали четкие нефункциональные требования, типа «уложиться в 2 гигабайта памяти при миллионе одновременных соединений», это было бы конкретно.

asaw ★★★★★ ()

Тест полного задания: Необходимо создать клиентское и серверное приложения с помощью C++ и Qt

При подобном требовании контора посылается в эротическое путешествие и ищется более нормальная, которая не даёт неоплачиваемых тестовых заданий.

UVV ★★★★★ ()
Ответ на: комментарий от Booster

Наследоваться от QThread или нет это дело вкуса.

Ага, а Qt-разработчики просто так пишут статьи типа «You're doing it wrong».

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

DarkEld3r ★★★★★ ()
Ответ на: комментарий от UVV

При подобном требовании контора посылается в эротическое путешествие и ищется более нормальная, которая не даёт неоплачиваемых тестовых заданий.

В нормальных условиях - да. Но если автор на плюсах писал пять лет назад и хочет снова, то контору можно понять.

DarkEld3r ★★★★★ ()

что за компания куда устривался? покажи их продукты, по таску они мало шарят в сетевом программировании, куте там явно лишний хвост и нужен видимо для клиент формочки задавать выводить значения, остальное пишется на голом С++, а использовать куте для нетворк кодинга явно феил самой компании, и у них это явно не профиль.

anonymous ()
Ответ на: комментарий от DarkEld3r

Нормально реагирую. Наследоваться можно, переопределять run плохо. Вся разница в том, что в одном случае работаешь через переменную класса, в другом через this.

Booster ★★ ()
Ответ на: комментарий от asaw

А шут их знает, как расшифровывают. Спросил у них еще раз о причине, сказали «код не годится для коммерческой разработки». :)

Booster ★★ ()
Последнее исправление: Booster (всего исправлений: 1)
Ответ на: комментарий от anonymous

а использовать куте для нетворк кодинга явно феил самой компании, и у них это явно не профиль.

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

asaw ★★★★★ ()
Ответ на: комментарий от Booster

Их вполне могла отпугнуть неопрятность. Люди разные бывают, на разное обращают внимание.

asaw ★★★★★ ()
Ответ на: комментарий от asaw

смысл не в том что распилили, а в том что серьезные сетевые проекты даже на распилиной от куте либе не пишутся, тонкие пуллинги, сериализации, криптография итд. да - всякие легкие парсеры текста по вебу аля http или банальные пинг-понги на куте распиленой части можно набросать, но это детские забавы аля веб броузеров

anonymous ()
Ответ на: комментарий от anonymous

Вот только не надо рассказывать сказки про «серьезные сетевые проекты», ок? «Серьезные сетевые проекты» пишутся на чем угодно, весь вопрос в требованиях.

asaw ★★★★★ ()
Ответ на: комментарий от asaw

конечно, когда требование писать сетевое фуфло, тогда куте вполне подходит.

anonymous ()
Ответ на: комментарий от asaw

А в чем конкретно заключается неопрятность? В одном месте оставил закомментированный метод и про передачу исключений по значению тоже отметили, а так что-то не найду больше.

Booster ★★ ()
Ответ на: комментарий от Booster

Да хотя-бы что сервера два, причем один из них виндовый. Зачем виндовый, разве его просили? Зачем файлы вроде Client.pro.user и Server.v12.suo? Почему в программе на Qt одни функции-члены именуются с маленькой буквы, а другие с большой:

class Client : public QObject
{
    Q_OBJECT

public:
    Client();
    virtual ~Client();
    void Connect(QString address, unsigned short port);
    void Disconnect();
    void Send(double value);
    void Start();
    void Stop();

signals:
    void stateChanged(QAbstractSocket::SocketState state);
    void valueReceived(double sentValue, double result);

private slots:
    void onStateChanged(QAbstractSocket::SocketState state);
    void onValueReceived(double sentValue, double result);

Это же не оффтопик, чтоб так методы называть. Вот они на всё это посмотрели и подумали, что у тебя windows головного мозга и ты им не подходишь (как вариант) ;)

asaw ★★★★★ ()

.sln

крути педали пока не дали, малыш.

anonymous ()
Ответ на: комментарий от UVV

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

Таких нет. Все нормальные конторы дают тестовые задания — естественно, не оплачиваемые.

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

Miguel ★★★★★ ()
Ответ на: комментарий от asaw

Это же не оффтопик, чтоб так методы называт

Так — это как? И что конкретно виндового в таком названии методов?

anonymous ()
Ответ на: комментарий от anonymous

Так - это с прописной буквы. В Qt, очевидно, другой стиль. А называть функции с прописной буквы - стопроцентный мелкомягкий стиль.

asaw ★★★★★ ()
Ответ на: комментарий от Booster

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

код не годится для коммерческой разработки

Возможно, они ждали некой завершенности приложения, т.е. готовый продукт. Тогда бы я, в дополнение к вышесказанному, обратил внимание на магические числа, вроде:

...
if (port > 0xffff)
...
font.setPointSize(12);
...
_updateTimer->setInterval(1000);
...

т.е. неплохо бы создать конфиг для этих вещей. И строки хранить в отдельном файле, чтобы проще было локализовывать/масштабировать, а не хранить все это в лапшеобразном виде. Обработку ошибок реализовать как-то гибче, добавить ведение лога и т.д.

+ Неясно с использованием winapi, стояла ли задача написать это именно под win? Какой тогда смысл в кьют?

Nietzsche ()
Ответ на: комментарий от Nietzsche

Насчет конфигов согласен. Но порт по определению не может быть больше 0xffff. Интервал 1 секунда, тоже менять ненужно. Размер шрифта статусбара соотносится с размерами шрифтов остальных контролов. Я бы хотел его как-то вынести в сам редактор форм, но не знаю как это сделать, статусбар собака создается динамически. Можно конечно было задать все это отдельными константами. Про логи это уже перегиб, забесплатно не собираюсь этого делать, выводом в консоль обойдутся. Задачи с винапи не было, просто изначально я сделал именно его, а потом подумал, что может они ожидают на Qt и сделал до кучи, тем более раньше никогда такого не делал.

Booster ★★ ()
Последнее исправление: Booster (всего исправлений: 3)

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

mix_mix ★★★★★ ()
Ответ на: комментарий от anonymous

Угу, тут вот прям рука мелкомягких заметна.
MSVCToolChain

Ещё как. Вообще месево какое-то.

asaw ★★★★★ ()
  • неправильно работаешь с send/recv.
  • не учитываешь порядок байт при передаче double.
  • мешанина из Qt, крестов, сей.
  • какой-то ад в структуре проекта сервера.
vvviperrr ★★★★★ ()
Последнее исправление: vvviperrr (всего исправлений: 3)
Ответ на: комментарий от mix_mix

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

Booster ★★ ()
Ответ на: комментарий от vvviperrr

Про порядок забыл - косяк, спасибо. Да, работа с send/recv неправильная, но решил забить так как всего лишь double, на будущее учту. В чем проблема совмещения Qt и С++? Где там си? Что с архитектурой? Давай конкретику.

Booster ★★ ()
Последнее исправление: Booster (всего исправлений: 1)
Ответ на: комментарий от vvviperrr

не учитываешь порядок байт при передаче double.

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

asaw ★★★★★ ()
Последнее исправление: asaw (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.