Зацените тестовое задание
От: Kaifa Россия  
Дата: 28.09.18 14:11
Оценка: 4 (2) +2 :)
Т.к. принципиально тематика не моя (уж не знаю чего они там узрели в моем резюме, т.к. писал им не я), и кроме того просьбы не распространять не было, цитирую задание, которое даже не пытался решать. может кому-то будет полезно. контора United Traders

Вопрос 1.
Ваш друг детства Егор, всерьез занявшийся фермерским хозяйством, попросил Вас разработать сервис, который будет круглосуточно отслеживать изменения цен на капусту, продающуюся на Брюссельской Капустной Бирже. Также его интересуют цены на перец, который продают на Бирже Перца Болгарии.
Вы решили подключиться к обеим биржам по API, которые они предоставляют. Обе дают возможность подключаться как по HTTP REST, так и через веб-сокеты.
Сервис должен позволять складывать в базу данных информацию о ценах на продукты и историю изменения цен, а также давать возможность в любой момент просматривать текущие цены, не замедляя при этом сохранение новых цен.
Помните, что рынки капусты и перца — высоковолатильные, а значит цены на них меняются по 50-100 раз за секунду, а иногда и чаще.

Опишите в нескольких предложениях как бы Вы реализовали бэкенд такого сервиса?

Вопрос 2.
Егору очень понравился Ваш сервис мониторинга цен капусты и перца. Теперь он подумывает о том, чтобы собранная информация применялась бы и в другом его сервисе, который Вы делали ему в прошлом году — "Бухгалтерия Фермера".
В "Бухгалтерии Фермера" при каждом изменении цены на капусту или перец должны автоматически пересчитываться показатели доходности фермерского хозяйства.
Также Егор упомянул, что если все будет хорошо, то такие данных о ценах неплохо было бы в будущем передавать еще и в Мобильное приложение, которое Вы ему, как он надеется, сделаете. Но это в будущем, сейчас такую передачу делать ему не надо.

Опишите в нескольких предложениях, как бы Вы передавали собранную информацию из сервиса мониторинга цен в сервис "Бухгалтерия Фермера"?

Вопрос 3.
Оба Ваших новых сервиса очень понравились Егору. Но через некоторое время он пришел к Вам с новой проблемой. Егор точно помнит, что у него был покупатель Евгений, на вид лет 30-35, который купил у него по интернету очень много капустных пирожков, то ли с выставлением счета, то ли нет.
Егор сам пытался достать нужную ему информацию из сервиса "Бухгалтерия Фермера", и даже написал для этого SQL-запрос к PostgreSQL базе данных, но что-то не работает:

SELECT * FROM customers
JOIN payments ON payments.customer_id = customers.id
JOIN invoices ON invoices.customer_id = customers.id
WHERE customers.first_name LIKE 'Евгений' AND customers.birthdate >= DATE('1985-08-02')

Запрос не выдает совсем ничего.

В чем может быть дело?

Вопрос 4.
Вам надоело делать программы для фермы Егора, и Вы устроились на новую работу. Вам показывают исходный код проекта, с которым предстоит работать.
Среди прочего в исходниках есть следующий менеджер команд. Этот класс вроде бы потокобезопасен и работает, исполняя в специальном потоке те команды, что поставлены в очередь методом Enqueue.
Вам не понравился увиденный код. Опишите какие проблемы в классе Вы видите?

public class TasksManager
{
    private readonly Queue<Command> _commandQueue = new Queue<Command>();
    private readonly AutoResetEvent _newCommandArrivalEvent = new AutoResetEvent(false);
    private readonly Thread _commandRunningThread;
    private readonly Logger _logger;

    public TasksManager()
    {
        _logger = ServicesContainer.GetLogger();
    }

    public void Start()
    {
        _commandRunningThread = new Thread(ProcessCommands);
        _commandRunningThread.Start();
    }

    private void ProcessCommands()
    {
        while (true)
        {
            _newCommandArrivalEvent.WaitOne();
            lock (_commandQueue)
            {
                Command command = _commandQueue.Dequeue();
                command.Execute();
            }
        }
    }

    public void Enqueue(Command command)
    {
        lock (_commandQueue)
        {
            _commandQueue.Enqueue(command);
            _logger.Debug("Command enqueued");
        }
        _newCommandArrivalEvent.Set();
    }
}

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.