Тестовое задание для javascript-разработчика
Пожалуйста, не пишите название компании в коде, названии проекта, readme.md, или где-либо еще, чтобы нельзя было найти простым поиском ваше решение.
Тестовое задание представляет из себя несколько задач, выполняемых в одной кодовой базе (для каждого модуля). Выполнение каждой задачи требует знания различных технологий, если на какой-то задаче у вас возникли трудности, ее можно пропустить и перейти к следующей.
Задачи делятся на 2 модуля: backend и frontend, и вы можете выполнить задачи из модуля, соответствующего позиции, на которую вы претендуете, либо выполнить задачи из обоих модулей.
Вы можете сделать столько задач, сколько сможете, либо сколько посчитаете нужным, но в зависимости от количества выполненных задач мы получим объективное представление о ваших навыках. Чем больше задач будет выполнено, тем выше мы оценим ваши навыки.
Решение может быть прислано ссылкой на открытый репозиторий на github / bitbucket / gitlab.
Для выполнения задач мы не ограничиваем вас никакими технологиями и библиотеками, если это не оговорено в задании. Выбирайте те инструменты, с которыми работали, или которые на ваш взгляд подходят для выполнения поставленной задачи.
backend
В партнерской программе IQ Option есть раздел с новостями, представляющий из себя ленту, в которой, с одной стороны, менеджер создает записи, а партнеры, с другой стороны, их читают. Вашей задачей будет создание отдельного сервера, обслуживающего эту функциональность.
Отдельным плюсом будет использование typescript для решения этого задания.
- Реализуйте простейший echo-сервер
- Реализуйте логирование всех http-запросов
- Добавьте rate limiter
- Реализуйте произвольный механизм сессий
- Реализуйте REST API интерфейс в котором предусмотрено:
- создание новости
- возврат всего списка новостей
- возврат конкретной новости
- обновление новости
- замена новости
- удаление новости
- хранение всех новостей в памяти
- Создайте
Dockerfile
для сервера, чтобы иметь возможность запускать его в изолированной среде - Добавьте
docker-compose.yml
файл для запуска командойdocker-compose up
- Подключите к серверу любую SQL базу данных, и перенесите туда хранение новостей. Добавьте базу данных в
docker-compose.yml
- Реализуйте произвольный механизм регистрации и авторизации
- Реализуйте произвольный механизм ролей, и добавьте ограничение на вызовы API, через которые можно менять данные
- Реализуйте API для отметки прочтения пользователем новости
- Реализуйте возможность подписки через web socket на событие добавления новости
- Реализуйте механизм запуска сервера в нескольких процессах с помощью модуля
cluster
, и не забудьте про уведомление подписчиков, висящих на других процессах, об добавлении новости - Реализуйте graceful shutdown
- Напишите тесты, любые: unit, integration, end-to-end и так далее, которые сами посчитаете нужными
- Настройте любую облачную CI (CircleCI, TravisCI, CodeShip) для запуска ваших тестов в облаке на любое изменение в любой ветке
- Настройте автоматический деплой на heroku с помощью выбранной CI при обновлении master-ветки в случае успешного прогона тестов
frontend
Необходимо сделать приложение для оценки прибыльности портфеля ценных бумаг.
Практическая задача этого приложения - сравнить доходность диверсифицированного портфеля ценных бумаг (предполагается что доходность известна пользователю) с аналогичным по стоимости портфелем индексных ETF.
- Используйте create-react-app или вашу кастомную сборку webpack
- Сделайте форму редактирования портфеля. Это список активов, можно добавлять, редактировать, удалять активы. Пример данных ниже. Если в портфеле есть несколько одинаковых активов, и изменена его текущая цена в одной строке, то должны обновиться текущие цены того же актива и в других строках. Каждый актив имеет следующие поля:
- название актива
- дата покупки
- количество
- цена покупки (доллары, точность до 4 знака)
- сумма (количество * цена, вычисляемое не редактируемое поле)
- комиссия (доллары, любое число введенное пользователем)
- цена текущая (доллары, точность до 4 знака)
- При перезагрузке страницы данные портфеля должны сохраняться
- Постройте график стоимости портфеля
- На основе API котировок NASDAQ (symbol=QQQ) и данных портфеля выведите таблицу (смысл которой в том, чтобы показать, сколько лотов индекса можно было бы купить на те же деньги вместо покупки какого-то актива) по дням, начиная от даты создания портфеля (дата первого купленного актива) до сегодняшнего, с колонками:
- дата
- стоимость активов, добавленных в этот день в портфель (сумма + комиссия)
- цена закрытия индекса
- количество лотов индекса (получаем делением стоимости активов на цену закрытия индекса в этот день)
- Под таблицей вывести:
- вложения в портфель (сложить все суммы и комиссии из портфеля),
- стоимость индексную (последнюю цену закрытия индекса умножить на сумму лотов индекса)
- стоимость портфеля (сложите текущие стоимости каждого актива)
- прибыльность индекса (разницу в процентах между вложениями и стоимостью индекса)
- прибыльность портфеля (разницу в процентах между вложениями и стоимостью портфеля)
- Добавьте на график стоимость индексного портфеля (суммарная стоимость лотов индекса за каждый день)
- Добавьте select с выбором индекса для оценки. Варианты: S&P500 (symbol=SPY) и NASDAQ (symbol=QQQ)
- Задеплойте приложение на github pages или напишите как развернуть приложение локально
Постарайтесь не использовать css фреймворки, т.к. мы хотим увидеть ваш уровень верстки. Вы можете использовать любой css-препроцессор или же использовать css-in-js решения. В качестве js-фреймворка мы ожидаем увидеть react, в качестве сборщика - webpack, так как в компании используются именно эти технологии.
Для получения доступа к API котировок необходимо заполнить простую форму по адресу: https://www.alphavantage.co/support/#api-key
Пример вызова API:
https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=QQQ&outputsize=full&apikey=demo
Пример портфеля:
[
{symbol:'ABT',date:'2018-06-06',quantity:15,price:62.87,comission:0.28},
{symbol:'BABA',date:'2017-11-27',quantity:6,price:190.9,comission:4},
{symbol:'BABA',date:'2017-06-22',quantity:4,price:141.58,comission:1.7},
{symbol:'CSCO',date:'2018-05-18',quantity:25,price:43.68,comission:3.28},
{symbol:'CSCO',date:'2017-04-07',quantity:15,price:33.26,comission:2},
{symbol:'INTC',date:'2018-06-06',quantity:17,price:56.34,comission:0.29},
{symbol:'MA',date:'2018-06-06',quantity:5,price:200.89,comission:0.3},
{symbol:'NFLX',date:'2017-06-09',quantity:2,price:158.64,comission:1.74},
{symbol:'NFLX',date:'2017-05-11',quantity:4,price:158.99,comission:1.91},
{symbol:'NFLX',date:'2017-03-29',quantity:3,price:146.31,comission:2},
{symbol:'NVDA',date:'2017-11-24',quantity:5,price:215.83,comission:6},
{symbol:'NVDA',date:'2017-08-11',quantity:5,price:152,comission:3},
{symbol:'NVDA',date:'2017-06-02',quantity:5,price:143.95,comission:2.16},
{symbol:'NVDA',date:'2017-03-30',quantity:5,price:109.31,comission:2},
{symbol:'V',date:'2018-06-06',quantity:7,price:134.32,comission:0.28}
]
Пример текущей стоимости:
{
ABT: 64.55,
BABA: 181.99,
CSCO: 42.24,
INTC: 49.28,
MA: 201.10,
NFLX: 342.45,
NVDA: 249.44,
V: 138.57,
}