[Из песочницы] Отзыв на трудоустройство в компанию Soshace

В декабре 2017 интервьюировался в компанию Soshace на позицию Full-Stack Web Developer (JavaScript, remote work). На тот момент, мне не удалось найти каких-то отзывов о прохождении собеседования в эту компанию, поэтому решил заполнить пробел.

Вакансия была размещена публично на популярном российском сайте поиска работы.

dqci2yojlm5lsf7yoxq29ufuhn0.png
fuusmuhk6sq3ovkjq2pp3tcouou.png

Компания Soshace сама нашла меня и пригласила на собеседование. Примерно в это же время со мной связался сотрудник одного из российских кадровых агентств и прислал описание вакансии идентичное вышеприведенному, но откуда были удалены слова «Soshace». Позже оказалось, что компания ищет сотрудников не только напрямую, но и взаимодействует с некоторыми агентствами. С агентом я довольно быстро прекратил общение и в дальнейшем общался только напрямую с Soshace.

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

Указанный в вакансии уровень зарплаты — это теоретический максимум, который никто не гарантирует. Компания устанавливает сотруднику часовую ставку. Сотрудник компании обязан пользоваться программой трекинга времени HubStaff. В дальнейшем, исходя из натреканного времени, считается вознаграждение. Заказов у компании не достаточно, чтобы гарантировать полную долгосрочную занятость, поэтому по завершению проекта, пока компания не найдет следующий проект для сотрудника, сотрудник может заниматься своими делами — никакой поддержки он не получает. Основной источник клиентов компании — это Upwork и клиенты, с которыми они давно работают.

После прохождения собеседования по скайпу мне предложили пройти довольно объемный тест. Нужно было разработать веб-приложение, потратив несколько дней личного времени. Время, потраченное на тест, не оплачивается. На выполнение теста дается одна неделя. Soshace оценил тестовое задание в »2 дня», что, на мой взгляд, очень занижено. По их словам, рекорд прохождения подобного теста у них — 15 часов. Я оценил данное тестовое задание в 35 часов, исходя из моего опыта выполнения аналогичных тестовых заданий для других компаний. Все время, которое я работал над тестом, трекалось с помощью программы HubStaff. Согласно этой программе, я потратил на выполнение теста 22 часа чистого времени. Я считаю, что в реальной, не тестовой обстановке, я бы потратил на эту работу, как минимум, 40 часов, т.к. приходилось торопиться, принимать решения самостоятельно, упрощать, где только можно, т.е. там, где явно не было указано, что нельзя.

Для выполнения теста я выбрал последний на тот момент Angular 5 для front-end и node+express для back-end. На момент прохождения теста мне было 30 лет, а мой опыт профессионального программирования был более 9 лет. Правда, большая часть этого опыта была с .Net, Asp.Net, который слабо пересекается с той позицией, на которую я претендовал, хотя с помощью .Net я разрабатывал сайты более 6 лет. Что касается выбранного стека, то на Angular у меня было два завершенных небольших проекта, первый на Angular 1.64, другой на Angular 4. C node.js я работал только в рамках, необходимых для работы Angular. Бэк-енд на node я никогда не разрабатывал, с Express никогда не работал.

После того, как я отправил тестовое задание на проверку, ответ я получил довольно быстро — на следующий день. Мне написали:

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

Позже, правда, мне сказали, что дело не в тесте, а отказано было по другой причине, но об этом позже. Сначала мне привели причины, почему тест не пройден. Я не знаю в каком порядке были указаны причины — от более серьезной к менее серьезной или порядок не имеет значения. Я приведу их в том порядке, в котором они были мне присланы (нумерацию я проставил сам). Также после некоторых пунктов я привел свой небольшой комментарий с пояснением написанного и почему я сделал так, а не иначе. Также я привел свои советы, как надо делать, чтобы увеличить свои шансы успешного прохождения собеседования в компанию Soshace, если кто-то решится.

  1. Когда заходишь на страницу login вываливается ошибка:
    [DOM] Found 2 elements with non-unique id #inputEmail: (More info: goo.gl/9p2vKq)
    [DOM] Found 2 elements with non-unique id #inputPassword: (More info: goo.gl/9p2vKq)
    Здесь под страницей Login имеется ввиду страница регистрации. Контролы для входа в систему также присутствовали на странице — в шапке сайта. И в контролах регистрации и в контролах входа присутствовали контролы для ввода имейла и пароля. И для них я использовал одинаковые id (хоть и разный name), т.е. два поля email с одинаковым id, и два поля password с одинаковым id. В данной статье перечислены некоторые причины, почему это может быть опасно. На мой взгляд, ни одна из приведенных причин к моей ситуации не имеет отношения. Также, я не понял, почему у них ошибка, как они выразились, «вываливается». Возможно, они пользуются какой-то специфичной надстройкой по html валидации.

    Совет: прогоняйте свои страницы через html-валидатор.

  2. В самом приложении использовал только records в API, соответственно для того, чтобы сгенерировать отчет нужно получить все записи. Если их будет много, будет занимать много времени + мы можем захотеть загружать записи постранично. Reports должны генерироваться на сервере и для них должен быть создан специальный api запрос.
    Поясню, что имеется в виду. Было 2 страницы, одна показывала все записи, другая отчет по этим записям. Строка отчета — это агрегация не более семи записей (запись — это день, а отчет — это понедельная агрегация). «мы можем захотеть загружать записи постранично» — никак не было отражено в требованиях. В требованиях было четко указано, что показывать надо все записи. Также, в требованиях не было упоминания о том, что «Reports должны генерироваться на сервере и для них должен быть создан специальный api запрос». Я согласен, что в реальном приложении, это, может быть, и будет иметь смысл, а выбранный мной подход можно было бы охарактеризовать как SmartUI anti-pattern. Но все-таки для таких выводов надо иметь большее представление о домене. Я же посчитал, что для такого простейшего приложения, использованный мной подход имеет смысл.

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

  3. каждый раз при переключении между records и reports происходит запрос к {*ip_address*}:3000/records по поводу OPTIONS, не очень понял зачем это нужно, когда в системе только один тип пользователей. Тем более зачем это нужно делать каждый раз.
    Здесь суть претензий мне не ясна. При переключении между страницами происходит запрос к API по другому адресу (домену, порту), т.е. CORS. По установленным стандартам, браузер сначала автоматически посылает pre-flight запрос OPTIONS, и только потом настоящий запрос. И не каждый раз, а используется кэширование, например в Chrome 5 секунд. Время может быть увеличено, но так работает по умолчанию.

    Совет: для того, чтобы у компании Soshace возникло меньше вопросов, увеличьте время кэша (Access-Control-Max-Age) до часа.

  4. Плюс в самом коде использовал длинные конструкции в return типа:
    vt1iu6_kulccnqscia7si-saubs.png
    Такой код сложно поддерживать, почему нельзя вынести заголовок и прочее в отдельную переменную или функцию, например вот так:
    addBookWithObservable(book:Book): Observable {
     let headers = new Headers({ 'Content-Type': 'application/json' });
     let options = new RequestOptions({ headers: headers });
     return this.http.post(this.url, book, options)
     .map(this.extractData)
     .catch(this.handleErrorObservable);
    }
    

    Совет: если выражения можно вынести в отдельную переменную — выносите. Возьмите приведенный выше пример от компании Soshace за образец.
  5. В названиях папок в проекте использованы, например directives, не понял зачем.
    Совет: старайтесь использовать best practices для структурирования папок. Например, как в mgechev/angular2-seed. Здесь лучше не фантазируйте и своего не выдумывайте.
  6. Из плюсов: написаны тесты да и в принципе приложение рабочее, просто ищем более опытных сотрудников.
    Написанные тесты — это то, что было создано автоматически angular/cli. Я их лишь пофиксил, чтобы они работали, но не более.

    Совет: С тестами не заморачивайтесь, если пользуетесь angular/cli, просто убедитесь, что тесты работают. Лучше фикс тестов сделать отдельным пушем в гит, чтобы была заметнее активность по тестам. Один — два e2e теста и 7 юнит тестов достаточно.


Это все, что они мне прислали. Обратите внимание на фразу «просто ищем более опытных сотрудников». После того, как я узнал результаты, я подготовил черновик данной статьи и выслал сотруднице компании для ознакомления. После этого со мной по скайпу связался другой сотрудник компании, чтобы обсудить со мной мой отзыв. По его словам, я выполнил тест не хуже, чем кандидаты, прошедшие тест. Мне было отказано, потому что у меня недостаточно опыта работы с требуемыми технологиями. Я согласен с тем, что я не самый опытный Angular разработчик, и, тем более, node. Но почему я должен был тратить время на тест, если он ни на что не повлиял, мне не понятно.

Заключение.

— На прохождение собеседования я потратил более 24 часов чистого времени.
 — Не понятно для чего я делал большое тестовое задание и повлияло ли оно на что-либо.
 — Мне было отказано и не был предложен даже минимальный рейт.
 — Отзыв на тестовое задание я получил, на мой взгляд, слабый.
 — Никак не был оценен backend проект, написанный на node, хотя я потратил на это больше половины времени (позиция Full Stack разработчик). В силу отсутствия у меня опыта работы с node я использовал примитивнейшую архитектуру (если можно сказать, что она вообще была).
 — В компании работают сотрудники из Санкт-Петербурга. Все с кем я общался и все кто был указан у них на сайте на тот момент — все оттуда. Какая-то часть из них (а может и все) вынуждена посещать офис.

© Habrahabr.ru