Skip to content

Тестовое задание на позицию backend-разработчик

Notifications You must be signed in to change notification settings

notcgi/php-interview

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Тестовое задание на позицию backend-разработчик

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

Решение необходимо разместить в git и предоставить ссылку. 
Общую часть можно поместить в один файл, практическую часть рекомендуется выполнять непосредственно в файлах с заданиями.

Задачи на общий уровень владения языком

ответом на каждую из задач должен быть код

Для всех заданий с массивами задан многомерный массив, элементы которого могут содержать одинаковые id:

$array = [
  [id => 1, date => "12.01.2020", name => "test1" ...],
  [id => 2, date => "02.05.2020", name => "test2" ...],
  [id => 4, date => "08.03.2020", name => "test4" ...],
  [id => 1, date => "22.01.2020", name => "test1" ...]
  [id => 2, date => "11.11.2020", name => "test4" ...],
  [id => 3, date => "06.06.2020", name => "test3" ...],
]

Все решения постараться реализовать НЕ используя циклы for / foreach.

  1. выделить уникальные записи (убрать дубли) в отдельный массив. в конечном массиве не должно быть элементов с одинаковым id.

На выходе:

$array = [
  [id => 1, ...],
  [id => 2, ...],
  [id => 4, ...],
  [id => 3, ...],
]

Решение:

$array = array_column($array,null,'id');
$array = array_values($array);
  1. отсортировать многомерный массив по ключу (любому)

Решение: Аналогично предыдущему

$array = array_column($array,null,'name');
asort($array);
$array = array_values($array);

или

usort($array, fn($a, $b) => $a['name'] <=> $b['name']);
  1. вернуть из массива только элементы, удовлетворяющие внешним условиям (например элементы с определенным id) Решение:
$array = array_filter($array, fn($elem) => $elem['id'] === 1);
  1. изменить в массиве значения и ключи (использовать name => id в качестве пары ключ => значение)

На выходе:

$array = [
  "test1" => 1,
  "test2" => 2,
  "test4" => 4,
  "test3" => 3
]

Решение:

$array = array_column($array,'id','name');
  1. В базе данных имеется таблица с товарами goods (id INTEGER, name TEXT), таблица с тегами tags (id INTEGER, name TEXT) и таблица связи товаров и тегов goods_tags (tag_id INTEGER, goods_id INTEGER, UNIQUE(tag_id, goods_id)). Выведите id и названия всех товаров, которые имеют все возможные теги в этой базе.

На выходе: SQL-запрос.

Решение:

select *
from goods where id in (select goods_id
                        from goods_tags
                        group by goods_id
                        having count(tag_id) = (select count() from tags))
  1. Выбрать без join-ов и подзапросов все департаменты, в которых есть мужчины, и все они (каждый) поставили высокую оценку (строго выше 5).
create table evaluations
(
    respondent_id uuid primary key, -- ID респондента
    department_id uuid,             -- ID департамента
    gender        boolean,          -- true — мужчина, false — женщина 
    value         integer	    -- Оценка
);

На выходе: SQL-запрос. Решение:

select department_id
from evaluations
where gender = true
group by department_id
having count() = count(case when value>=5 then 1 end);

Практические и архитектурные задачи

Решение должно быть "концептуально" правильным. Мы не будем досконально тестировать корректную работу системы на всех краевых случаях :)

  1. Даны 2 класса. Один реализует поведение объектов, второй - сам объект. Привести функцию handleObjects в соответствие с принципом открытости-закрытости (O: Open-Closed Principle) SOLID.

(код представлен в папке architecture, в файле solid_o.php)

  1. Устранить нарушения первого пункта принципа инверсии зависимостей (D: Dependency Inversion Principle) SOLID: « 1. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. »

(код представлен в папке architecture, в файле solid_d.php).

  1. Имеется метод getUserData, который получает данные из внешнего API, передавая в запрос необходимые парамерты, вместе с ключом (token) идентификации. Необходимо реализовать универсальное решение getSecretKey(), с использованием какого-либо шаблона (pattern) проектирования для хранения этого ключа всевозможными способами:
  • in file
  • in DB
  • in server memоry (redis as example)
  • in cloud
  • etc.

Достаточно реализовать простое решение, которое бы позволяло через параметр (в условной "глобальной конфигурации" / внутри класса данного метода), выбирать любой существующий способ хранения. Перечисленные способы хранения служат лишь примерами для глобального восприятия задачи и не обязательны к реализации, можно ограничиться заглушками.

About

Тестовое задание на позицию backend-разработчик

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • PHP 100.0%