Здравствуйте, Аноним, Вы писали:
А>Уж как программер искать «приличную» работу в Питере устал.
А>Проблема в том, что слегка молод (22 года), без "опыта". С неоконченным «высшим», 4-й курс вечернего, т.е. свободного времени хоть отбавляй. Но правда без сертификатов.
А>Надоело получать в ответ дежурные сообщения, что дескать "ваше резюме добавленно в нашу БД", в стили тех же Digital Design и Qbix.
А>Надоело и непробиваемое молчание, весьма типичное для компаний вроде Aelita, демонстрируемое в ответ на выполненные тестовые по 2-м позициям. При том что именно сия контора объявила набор стажеров и даже о записи на "обучение" молодых "спецов".
У меня нет, к сожалению, рецензии именно Вашего тестового задания (речь идет
о этом задании), но, для иллюстрации, я приведу два примера (успешный и не успешный) рецензий тестовых заданий месячной давности, чтобы показать, что во-первых, задания анализируются, во-вторых, что одного только факта исполнения кандидатом тестового задания недостаточно — еще важно КАК он его сделал:
Пример 1 (отрицательный).
Плюсы:
— юный возраст
— использование компонентов .NET (такое тестовое задание данному рецензенту попалось впервые);
Минусы:
— предыдущий опыт работы был связан скорее с администрированием, нежели с кодированием;
— "знаком с языком VC" — этого может оказаться недостаточно;
— задание выполнено как "отписка", без цели показать "все, на что способен", а с целью сделать "чтобы отстали"
— совершенно неудобный UI (пользователь должен знать имена сервисов и имена машин, чтобы запустить или остановить сервис);
— многократное создание одних и тех же объектов (в VB при каждом нажатии на кнопку создается COM-объект MyServControl; в VC тоже самое происходит с объектом ServiceController);
— catch(...) — за это у нас "расстреливают";
— глобальные директивы using — это, по крайней мере, плохой стиль программирования. Кроме того, раз уж написал
using namespace System::ServiceProcess;
то зачем тогда дальше писать
System::ServiceProcess::ServiceController *SC;
?
В общем, решили не приглашать.
Пример 2 (положительный)
Плюсы
— человек явно стремится показать свои знания (проект выглядит крупнее и "продвинутее" среднестатистического тестового задания);
— не часто встречается в заданиях запуск и останов зависимых сервисов;
— использование обертки для SC_HANDLE;
— использование WNetAddConnection (очень редко встречается в заданиях);
— использование коллекций VB.
Минусы:
— в коде не выбрасывается ни одно исключение, но встречается огромное количество конструкций
try {}
catch(...) {}
— обработка ошибок сделана на возвращаемых значениях (в качестве типа ошибки используется свой собственный enum);
— использование таких конструкций как
using CConnectionImpl::OpenConnection; (см. класс CManagerImpl) конечно говорит о том, что человек знает о их существовании, но на практике означает просчеты в проектировании (в проекте такого масштаба они явно не уместны!);
— встречаются "сишные" функции; используется CString вместо std::basic_string<> (стоит ли прикручивать целый MFC ради этого?);
— доступ к внутреннему представлению вектора (см., например, ServiceCtrl::QueryServiceConfig());
— std::vector<LPCTSTR> a_Array(a_Size); — выглядит пугающе (это отмечает в комментариях и сам автор);
— функция CManagerImpl::WaitForServiceState() содержит конструкцию
for(;;)
{
...
Sleep(a_Wait);
}
и вызывается в основном потоке (фактически, прямо в обработчике сообщений от UI); как следствие, приложение "зависает", пока не запустится (не остановится) соответствующий сервис (может, это как-то реализовано в VB?).
Мнение рецензента: "Не знаю как на ведущего, а на простого "программиста второго уровня" вполне тянет".
Кандидата пригласили на собеседование.