dutsik / skyeng-test

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Тестовое задание в SkyEng

Задание можно посмотреть здесь: [https://docs.google.com/document/d/1d0pY2Bq3bOCmaEAoEduDhQdOlorw9IdM2XkQkZraFOs/edit]

Задание 1. Спроектировать схему БД для хранения библиотеки.

Результат: db-fiddle

Задание 2. Реализовать счетчик вызова скрипта.

Было принято решение, хранить данные в файле.

  1. Основная проблема это совместный доступ к файлу несколькими потоками, если одновременно 2 потока прочитают число, а потом запишут, то получим +1 вместо +2. Самое простое решение - это локать файл перед чтением и снимать лок после записи. Но, глобальные локи никому не нужны, т.к. могут привести к непредвиденным последствиям. Например, если скрипт этот связан с загрузкой веб страницы, пользователь увидев тормоза, обязательно нажмет F5, запустив еще один вызов и таким образом только усугубив все. В качестве решение данной проблемы возможно использовать несколько файлов. Программно определить правила записи и контроля над параллельным доступом и дополнительно реализовать скрипт сбора счетчиков в один файл.

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

php ./task2/index.php
  1. В качестве альтернативы мы можем использовать СУБД и написать нативную процедуру инкрементирования счетчика, либо использовать Redis в качестве хранилища счетчика. Обе эти технологии позволят решить проблему с конкурентными запросами нативно, а также могут использоваться в распределенной среде, когда скрипты вызываются на разных машинах.

Задание 3

Code Review

Неправильно использован паттерн проектирования. Во-первых, декоратор здесь никчему, во-вторых, он неправильно применен. Посмотрите, например, тут. Ну и по коду, переименуйте класс DecoratorManager в Provider, логгер вынесите в конструктор, создайте интерфейс подключения к источнику данных, передайте его в качестве параметра при инициализации,отнаследуйте от этого интерфейса ваш класс взаимодействия с сервисом, отредактируйте код ваших классов в соответствии с выше указанными замечаниями.

Пример реализации

php ./src/try.php

Задание 4

У вас нет доступа к библиотекам для работы с большими числами. Дано два положительных целых числа в виде строки. Числа могут быть очень большими, могут не поместиться в 64 битный integer.

В качестве решение в лоб, решил воспользоваться всеми известным(еще со школы) методом сложения в столбик :). Считаю данный подход надежным, хотя наверное есть более оптимальные способы решить данную задачу, можно опредилить размер чисел поддерживаемых системой и делить строки на большие числа, можно перейти к двоичному представлению и воспользоваться побитовыми операторами и т.д.

Пример использования:

php ./task4/index.php 1231242121321323 123124325143251235

Задание 5 Написать SQL запрос который выведет все пропуски.

Результат: db-fiddle

About


Languages

Language:PHP 100.0%