Найти в Дзене
DevRootIT [Python/Django]

Junior Python/Backend собеседование/интервью ответы

Эта статья состоит из заметок, собранных мной во время поиска работы на Junior позицию. Многое вам точно уже будет известно, но адекватно сформулировать самому - это совсем другое.
1. Сетевые протоколы (их много, так что только прикладного уровня рассмотрим)
Протоколы прикладного уровня обеспечивают взаимодействие между человеком и сетью. Этих протоколов огромное количество, и выполняют они
Оглавление

Эта статья состоит из заметок, собранных мной во время поиска работы на Junior позицию. Многое вам точно уже будет известно, но адекватно сформулировать самому - это совсем другое.

1. Сетевые протоколы (их много, так что только прикладного уровня рассмотрим)

Протоколы прикладного уровня обеспечивают взаимодействие между человеком и сетью. Этих протоколов огромное количество, и выполняют они совершенно различные роли. Я приведу примеры часто используемых протоколов в сети и покажу, как они работают на практике: HTTP, DNS, SSH, FTP и другие.

Протокол HTTP (англ. HyperText Transport Protocol). Протокол передачи данных, используемый обычно для получения информации с веб-сайтов. Использует он «клиент-серверную» модель. То есть существуют клиенты, которые формируют и отправляют запрос. И серверы, которые слушают запросы и, соответственно, на них отвечают.

DNS (Domain Name System). Система доменных имен. Если говорить в целом, то она хранит информацию о доменах. Например, какому IP адресу соответствует определенное имя. Приведу пример: когда вы открываете свой любимый сайт, то обращаетесь к нему по имени. Но в поля Source Address и Destination Address, которые работают на сетевом уровне, нельзя вставить имя. Там обязательно должен присутствовать именно IP адрес. Вот DNS как раз этим и занимается. Она сообщает, какой IP адрес у запрошенного имени. Вы, к примеру, обращаетесь на google.ru. Ваш компьютер понятия не имеет, кто и что это. Он спрашивает у DNS-сервера: Кто такой google.ru? И сервер отвечает, что google.ru — это 74.125.232.239 (это один из его адресов). И уже после этого, компьютер отправляет запрос на 74.125.232.239. Для пользователя все останется по-прежнему, и в адресной строке он также будет видеть google.ru.

Проектирование высоконагруженных систем

Вертикальное масштабирование - увеличение мощности сервера
Горизонтальное масштабирование - увеличение количества серверов

nginx - веб-сервер, который принимает запрос и проксирует (Допустим, у вас в локальной или виртуальной сети есть какие-то сервисы, не имеющие прямого доступа из интернета. А вы хотите таковой иметь. Можно пробрасывать нужные порты на шлюзе, можно что-то еще придумывать. А можно сделать проще всего - настроить единую точку входа на все свои сервисы в виде nginx сервера и с него проксировать различные запросы к нужным серверам.), передает на сервер приложения, т.е. сервер, который запускает код приложения (gunicorn);

Варианты масштабирования:
1. Выносят базу данных.
2. Выносят nginx сервер, gunicorn сервер и сервер базы данных
3. Клонируют сервера gunicorn и, возможно, базы данных и случайно проксируют

SOLID:

  1. Класс должен быть ответственен лишь за что-то одно.
  2. Программные сущности (классы, модули, функции) должны быть открыты для расширения, но не для модификации.
  3. Классы-наследники могли бы использоваться вместо родительских классов, от которых они образованы, не нарушая работу программы
  4. Создавайте узкоспециализированные интерфейсы, предназначенные для конкретного клиента. Клиенты не должны зависеть от интерфейсов, которые они не используют.
  5. Объектом зависимости должна быть абстракция, а не что-то конкретное.

Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.

Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Руководящие принципы написания RESTful-интерфейсов.

Client-Server. Отделяя пользовательский интерфейс от хранилища данных, мы улучшаем переносимость пользовательского интерфейса на другие платформы и улучшить масштабируемость серверных компонент за счет их упрощения.

Stateless (без состояния). Каждый запрос от клиента к серверу должен содержать в себе всю необходимую информацию и не может полагаться на какое-либо состояние, хранящееся на стороне сервера. Таким образом, информация о текущей сессии должна целиком храниться у клиента.

Cacheable (кэшируемость). Это ограничение требует, чтобы для данных в ответе на запрос явно было указано -- можно их кэшировать или нет. Если ответ поддерживает кэширование, то клиент имеет право повторно использовать данные в последующих эквивалентных запросов без обращения на сервер.

Uniform interface (единообразие интерфейса). 1) идентичность ресурсов; 2) манипуляция над ресурсами через представление; 3) исчерпывающие, понятные человеку сообщения; 4) гипермедиа (hypermedia) как движок для состояния приложения (HATEOAS) -- ссылки на другие ресурсы внутри приложения.

Layered system (многоуровневая система). Многоуровневость достигается за счет ограничения поведения компонентов таким образом, что компоненты "не видят" другие компоненты, кроме расположенных на ближайших уровнях, с которыми они взаимодействуют.

Code on demand (код по мере необходимости, необязательно). REST позволяет наращивать функциональность клиентского приложения по мере необходимости при помощи скачивания и исполнения кода в виде апплетов или скриптов. Это упрощает клиентские приложения, уменьшая количество заранее написанных возможностей.

MediaType — способ сказать серверу, в каком формате вы хотите получить содержимое.

Базы данных

Реляционная база данных (SQL) — база, где данные хранятся в формате таблиц, они строго структурированы и связаны друг с другом. В таблице есть строки и столбцы, каждая строка представляет отдельную запись, а столбец — поле с назначенным ей типом данных. В каждой ячейке информация записана по шаблону.

Нереляционная база данных (NoSQL) — хранит данные без четких связей друг с другом и четкой структуры. Вместо структурированных таблиц внутри базы находится множество разнородных документов, в том числе изображения, видео и даже публикации в социальных сетях. В отличие от реляционных БД, NoSQL базы данных не поддерживают запросы SQL.

ACID

Реляционные базы данных, в отличие от нереляционных, соответствуют ACID — это требования к транзакционным системам. Соответствие им гарантирует сохранность данных и предсказуемость работы базы данных:

Atomicity, или атомарность — ни одна транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной.

Consistency, или непротиворечивость — фиксируются только допустимые результаты транзакций.

Isolation, или изолированность — на результат транзакции не влияют транзакции, проходящие параллельно ей.

Durability, или долговечность — изменения в базе данных сохраняются несмотря на сбои или действия пользователей.

-------------------------------------------------------------------------------------------------

Первичный ключ

  1. Первичный ключ должен быть уникальным все время
  2. Он должен постоянно присутствовать в таблице и иметь значение
  3. Он не должен часто менять свое значение. В идеале он вообще не должен изменять значение.

Если же у нас есть несколько потенциальных ключей, то те потенциальные ключи, которые не составляют первичный ключ, являются альтернативными ключами (alternative key).

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

Нормальные формы

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

Отношение находится во 2НФ, если оно находится в 1НФ и каждый неключевой атрибут неприводимо зависит от Первичного Ключа(ПК).

Неприводимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, от которого можно также вывести данную функциональную зависимость.

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

-------------------------------------------------------------------------------------------------

Транзакции SQL – это группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными; транзакция — это единица работы, которая выполняется в отношении базы данных

Тестирование

Интеграционное тестирование - отдельные программные модули объединяются и тестируются в группе. Интеграционное тестирование в качестве входных данных использует модули, над которыми было проведено модульное тестирование, группирует их в более крупные множества. Используется для поиска ошибок взаимодействия между модулями системы или между системами

Модульное тестирование (unit testing) — процесс, позволяющий проверить на корректность отдельные модули, наборы из одного или более программных модулей вместе с соответствующими управляющими данными, процедурами использования и обработки

Другое

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

-------------------------------------------------------------------------------------------------

Компилируемый язык — это такой язык, что программа, будучи скомпилированной, содержит инструкции целевой машины; этот машинный код непонятен людям. Интерпретируемый же язык — это такой, в котором инструкции не исполняются целевой машиной, а считываются и исполняются другой программой (которая обычно написана на языке целевой машины).

-------------------------------------------------------------------------------------------------

Метакласс — это класс, экземпляры которого являются классами.

-------------------------------------------------------------------------------------------------

@property позволяет использовать метод как атрибут

@staticmethod определяет обычную функцию в пространстве имён класса

@staticmethod используется, когда мы хотим вернуть одно и то же, независимо от вызываемого дочернего класса.

@classmethod - это метод, который получает класс в качестве неявного первого аргумента, точно так же, как обычный метод экземпляра получает экземпляр. Это означает, что вы можете использовать класс и его свойства внутри этого метода, а не конкретного экземпляра. @classmethod — это обычный метод класса, имеющий доступ ко всем атрибутам класса, через который он был вызван

-------------------------------------------------------------------------------------------------

Итераторы — объекты, которые позволяют обходить коллекции.

Итерируемый — объект, в котором есть метод __iter__

В свою очередь, итератор — объект, в котором есть два метода: __iter__ и __next__. почти всегда iterator возвращает себя из метода __iter__, так как они выступают итераторами для самих себя, но есть исключения.

Генераторами называют итераторы, определение которых выглядит как определение функций. Ещё одно определение: генераторы — функции, которые внутри используют выражение yield

-------------------------------------------------------------------------------------------------

Celery

Фоновая обработка долго выполняющихся задач. Инструмент для управления очередями задач.

Celery снижает нагрузку на производительность, выполняя часть функциональности в виде отложенных задач либо на том же сервере, что и другие задачи, либо на другом сервере.

  • Хорошей практикой является сохранение ненадежных и трудоемких задач за пределами запроса.
  • Задачи, которые долго выполняются, должны выполняться в фоновом режиме воркерами (или другими способами).
  • Фоновые задачи могут использоваться для различных задач, которые не критичны для базового функционирования приложения.
  • Celery также может выполнять периодические задания с использованием службы celery beat.
  • Задачи могут быть более надежными, если они сделаны идемпотентными (не изменяет состояние системы, если она остановлена ​​на полпути) и повторены (возможно, с использованием алгоритма экспоненциального отказа).

[RU]
Слушай
подкаст в своем любимом приложении или на YouTube
[EN]
Castbox - 
https://castbox.fm/channel/id2555636
Apple Podcasts -
https://podcasts.apple.com/us/podcast/id149455872...