Вопросы тестового задания на вакансию код-ревьюера

HR прислал на почту ссылку на Яндекс-форму с вопросами. На выполнение тестового задания дается 3 дня, но если времени мало - просят предупредить об этом заранее.

Подробнее о вакансии.

Расскажите, чем отличается select_related от prefetch_related.

Мой ответ

select_related:

  • используется, когда мы собираемся получить один связанный объект (OneToOne, ForeignKey);
  • делает SQL join в том же запросе и возвращает результат как часть таблицы.

prefetch_related:

  • используется, когда мы собираемся получить набор объектов (ManyToMany, или обратная связь ForeignKey);
  • выполняет дополнительный запрос к базе с набором id (SELECT <something> WHERE pk IN (...)).

Вы написали 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"})

Ожидаемый результат: Получить ошибку валидации “Заголовок должен начинаться с заглавной буквы”

Расскажите, как работает алгоритм быстрой сортировки, какая у него сложность в лучшем и худшем случаях, опишите их. Является ли он стабильным?

Мой ответ

Алгоритм быстрой сортировки состоит из трех шагов:

  1. Выбрать опорный элемент (от выбора опорного элемента зависит эффективность сортировки).
  2. Сравнить остальные элементы с опорным и сгруппировать их тремя массивами в порядке: элементы меньше опорного, элементы равные опорному, элементы больше опорного.
  3. Применить рекурсивно два предыдущих шага для массивов меньших и больших, если они содержат больше одного элемента.

Лучший сценарий (он же средний): O(n*log n) - когда пограничным элементом выбирается средний, или ближайший к середине.

Худший сценарий: O(n**2) - если за опорный элемент берется первый или последний элемент.

Читал, что существует параллельная версия быстрой сор­тировки, которая сортирует массив за время О(n).

Алгоритм не является стабильным.

Опишите алгоритм поиска цикла в односвязном списке, сложность которого по памяти будет равна О(1).

Мой ответ

Самый очевидный вариант - это алгоритм Флойда с двумя указателями. Первый двигается по i-ым элементам, второй - по 2i. На каждом шаге i увеличивается на единицу и элементы сравниваются. Если элементы равны - цикл есть, если “быстрый” указатель достиг конца списка - цикла нет.

Есть еще алгоритм Брента, принцип похож, но проверяется степень двойки.

Задание описано по ссылке

Мой вариант код-ревью тут.

Расскажите не менее чем в трех предложениях, почему вам интересно заниматься код-ревью, и что вас мотивировало сделать тестовое.

Мой ответ
Код-ревью это неотъемлемая часть разработки. Глобально - это коммуникация и передача знаний между участниками этого процесса. Для меня код-ревью позволит внести свой вклад в развитие сообщества, подсказывая начинающим программистам лучшие практики и стандарты. С точки зрения личной выгоды - ревью кода прокачивает хард-скилы, заставляя чаще обращаться к стандартам языка, и тщательнее изучать их самому, что в итоге делает и мой код лучше. Вырасти как специалист, помогая расти другим - это и была моя мотивация.