Вопросы тестового задания на вакансию код-ревьюера
HR прислал на почту ссылку на Яндекс-форму с вопросами. На выполнение тестового задания дается 3 дня, но если времени мало - просят предупредить об этом заранее.
Вопрос №1: Django
Расскажите, чем отличается select_related
от prefetch_related
.
select_related
:
- используется, когда мы собираемся получить один связанный объект (
OneToOne
,ForeignKey
); - делает
SQL join
в том же запросе и возвращает результат как часть таблицы.
prefetch_related
:
- используется, когда мы собираемся получить набор объектов (
ManyToMany
, или обратная связьForeignKey
); - выполняет дополнительный запрос к базе с набором
id
(SELECT <something> WHERE pk IN (...)
).
Вопрос №2: Unit-tests
Вы написали view-функцию, обрабатывающую URL /new_post/
, которая на GET
запрос отвечает страницей с формой, а на POST
- создает новый пост из данных формы и редиректит на главную страницу. Опишите кейсы для юнит-тестов, которые вы бы написали для этой view-функции?
№1 Проверка доступности формы методом get
Действие: Запросить url /new_post/
Ожидаемый результат: response.status_code
равен HTTPStatus.OK
№2 Проверка успешности отправки формы и редиректа на главную
Действие: Отправить post-запрос на url /new_post/
со словарем полей формы (например data={"title": "This is title"}
)
Ожидаемый результат: 1) response.status_code
равен HTTPStatus.FOUND
2) response["Location"]
равен url главной страницы
№3 Проверка валидации полей формы
Действие: Передать в форму словарь с названием поля и его значением (например: {"title": "post title"}
)
Ожидаемый результат: Получить ошибку валидации “Заголовок должен начинаться с заглавной буквы”
Вопрос №3: Алгоритмы
Расскажите, как работает алгоритм быстрой сортировки, какая у него сложность в лучшем и худшем случаях, опишите их. Является ли он стабильным?
Алгоритм быстрой сортировки состоит из трех шагов:
- Выбрать опорный элемент (от выбора опорного элемента зависит эффективность сортировки).
- Сравнить остальные элементы с опорным и сгруппировать их тремя массивами в порядке: элементы меньше опорного, элементы равные опорному, элементы больше опорного.
- Применить рекурсивно два предыдущих шага для массивов меньших и больших, если они содержат больше одного элемента.
Лучший сценарий (он же средний): O(n*log n) - когда пограничным элементом выбирается средний, или ближайший к середине.
Худший сценарий: O(n**2) - если за опорный элемент берется первый или последний элемент.
Читал, что существует параллельная версия быстрой сортировки, которая сортирует массив за время О(n).
Алгоритм не является стабильным.
Вопрос №4: Алгоритмы
Опишите алгоритм поиска цикла в односвязном списке, сложность которого по памяти будет равна О(1).
Самый очевидный вариант - это алгоритм Флойда с двумя указателями. Первый двигается по i-ым
элементам, второй - по 2i
. На каждом шаге i
увеличивается на единицу и элементы сравниваются. Если элементы равны - цикл есть, если “быстрый” указатель достиг конца списка - цикла нет.
Есть еще алгоритм Брента, принцип похож, но проверяется степень двойки.
Практическое задание: ревью кода студента
Задание описано по ссылке
Мой вариант код-ревью тут.
Вопрос №6: Общая тематика
Расскажите не менее чем в трех предложениях, почему вам интересно заниматься код-ревью, и что вас мотивировало сделать тестовое.