🔰 Шпаргалка по бэкенду с картинками и не только / Backend cheatsheet with pictures and more
Go to file
2022-05-04 23:19:36 +03:00
files Add file 2022-04-29 21:48:41 +03:00
LICENSE Create LICENSE 2022-03-02 19:50:35 +03:00
README.md 📝 Update 2022-05-04 23:19:36 +03:00

Backend cheats

Данный репозиторий представляет собой наглядную шпаргалку по основным темам в области Backend-разработки. Весь материал разбит на темы и подтемы. Структура материала делится на 3 части:

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

🛠 Репозиторий находится в стадии активной разработки, поэтому постоянно обновляется и дополняется

🤝 Если вы хотите помочь проекту, не стесняйтесь присылать свои пулл реквесты

📝 The translation into English will be start after all the main topics have been completed

Содержание

1. Сеть и интернет
2. Операционные системы
3. Основы Linux
4. Общие знания
5. Язык программирования
6. Программное обеспечение
7. Базы данных
8. Разработка API
9. Кэширование
10. Безопасность
11. Тестирование
12. Построение архитектуры

Сеть и интернет

Интернет - это всемирная система объединяющая компьютерные сети со всего мира в единую сеть для хранения/передачи информации. Изначально Интернет разрабатывался для военных. Но вскоре он стал внедряться в учреждения образования (университеты), а затем его смогли использовать частные компании, которые начали организовывать сети провайдеров, предоставляющие услуги доступа в Интернет обычным гражданам. К началу 2020 года количество пользователей в сети Интернет перевалило за 4.5 млрд человек.

  • Как устроен Интернет

    Internet

    Ваш компьютер никогда не был связан с Интернетом напрямую. Поскольку он способен видеть только свою локальную сеть, в которую проводным (Ethernet) или беспроводным (Wi-Fi, Bluetooth) путем подключены другие устройства. Для связи с Интернетом в вашей локальной сети находиться специальный мини-компьютер маршрутизатор. Далее он связывает вас с интернет-провайдером, который в свою очередь связан с другими провайдерами более высокого уровня. Таким образом, ваше сообщение, проходит транзитом через сеть нескольких провайдеров, прежде чем достигнет сеть назначения.

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

    • Хост

      (host - принимающий) любое устройство, которое находится в какой-либо сети.

    • Сервер

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

🔗 Ссылки на материалы
  1. Как работает Интернет MDN (mozilla.org)
  2. Основы программирования. Как работают сети? YouTube
  3. Хост — что это такое и как он работает**
  4. Что такое сервер и как он работает
  • Что такое доменное имя

    Domain

    Доменные имена - это человеко-читаемые адреса веб-серверов, доступных в Интернете. Они состоят из частей (уровней) разделенных между собой точкой. Каждая из этих частей предоставляет специфическую информацию о доменном имени. Например страну, название сервиса, локализацию и т.д.

🔗 Ссылки на материалы
  1. Что такое доменные имена MDN (mozilla.org)
  2. Как работают домены
  • Что такое DNS

    DNS

    DNS (Domain Name System) - это децентрализованная система именования адресов в Интернете, которая позволяет создавать удобные для человека буквеные наименования (доменные имена) соответствующие числовым IP-адресам, которые используются компьютерами.

    • IP-адрес

      Специальный номерной идентификатор предоставляемый устройству находящемуся в сети работающей по протоколу IP

🔗 Ссылки на материалы
  1. Система доменных имен DNS — YouTube
  2. IP адрес — HackWare.ru
  • Устройство веб-приложений

    Современные веб-приложения состоят из двух частей: клиентской (frontend) и серверной (backend). Тем самым реализуя клиент-серверную архитектуру.

    Задачами клиентской части являются:

    • Реализация пользовательского интерфейса (внешний вид приложения)

      Для создания веб-страниц использются специальный язык разметки HTML
      Для стилизации шрифтов, расположения содержимого и т.д. используется язык стилей CSS
      Для добавления динамики и интерактивности язык программирования JavaScript

    • Cоздание функционала для формирования запросов к серверу

      Как правило это различного вида формы ввода, с которыми можно удобно взаимодействовать.

    • Примем данных от сервера и их последующая обработка для вывода на клиент

    Задачи серверной части:

    • Обработка клиентских запросов

      Проверка на наличие прав и доступа, разного рода валидации и т.д.

    • Выполнение бизнес логики

      Здесь может подразумеватся широкий спектр задач: работа с базами данных, обработка информации, вычисления и т.д. Это, так сказать, самое сердце мира Backend. Здесь и происходит все самое важное и интересное.

    • Формирование ответа и отправка его на клиент
🔗 Ссылки на материалы
  1. Как работают веб-приложения habr.com
  2. Нативные, гибридные и web-приложения в сравнении medium.com
  • Браузеры и как они работают

    Browser

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

🔗 Ссылки на материалы
  1. Как работают браузеры — MDN (mozilla.org)
  2. Как работают браузеры — введение в безопасность веб-приложений habr.com
  3. Подробное объяснение того, как работает браузер (под капотом)
🔗 Ссылки на материалы
  1. Хостинг: варианты, сравнения, пользовательская статистика — habr.com
  2. Хостинг: что это, зачем и как выбрать
  3. VPS-хостинг и облачный хостинг: что выбрать и в чем разница? habr.com
  • Протокол HTTP

    HTTP (HyperText Transport Protocol) - cамый важный протокол интернета. Используйтся для передачи любых данных. Сам по себе протокол работает по простому принципу: клиент посылает запрос на сервер, после чего получает ответ на этот запрос от сервера.

    • Структура HTTP-сообщений

      Стартовая строка -> Заголовки -> Тело сообщения

    • Заголовки

      Дополнительная служебная информация которая отправляется вместе с запросом/ответом.

    • Методы запросов

      GET - запрос на получение данных
      POST - запрос с передачей данных для создания новой записи
      PUT - запрос с передачей данных для изменения записи
      DELETE - запрос на удаление записи

    • Коды состояния

      Каждый ответ от сервера имеет специальный числовой код, который характеризует состояние отправленного запроса. Эти коды делятся на 5 основных классов:

      • 1хх - служебная информация
      • 2хх - успешный запрос
      • 3хх - перенаправление на другой адресс
      • 4хх - ошибка на стороне клиента
      • 5хх - ошибка на стороне сервера
    • HTTPS

      Тот же HTTP, но с поддержкой шифрования

    • Cookie

      Поскольку протокол HTTP не позволяет сохранять никакой информации о состояниях предыдущих запросов/ответов, возникает необходимость в использовании cookie. Куки позволяют серверу хранить различную информацию на стороне клиента, которую впоследующем клиент может отсылать обратно на сервер. В частности куки могут использоваться для авторизации или для сохранения различных настроек.

    • CORS

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

    • HTTP/1.0 vs HTTP/1.1 vs HTTP/2

      Главным нововведением в вeрсии 1.1 является режим "постоянного соединения", который позволяет посылать несколько запросов за одно подключение. Во второй версии протокол стал бинарным, появилась возможность передачи данных нескольких потоков по одному каналу.

🔗 Ссылки на материалы
  1. HTTP - MDN (mozilla.org)
  2. Простым языком об HTTP habr.com
  3. Путь к HTTP/2 habr.com
  • ек протоколов TCP/IP

    TCP/IP

    • Стек TCP/IP

      Модель (набор правил), которая описывает способ передачи данных от источника информации к получателю. Будет полезно иметь общее представление, как ваши данные проходят через все уровни протоколов.

    TCP UDP

    • TCP

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

    • UDP

      Простой протокол с быстрой передачей данных. Он не использует механизмов для гарантирования доставки и порядка следования данных. Используется, например в онлайн-играх, где частичная потеря пакетов не критична, но скорость передачи данных имеет гораздо более важное значение. Так же, запросы к DNS-серверам происходят через UDP протокол.

    • IP (Internet Protocol)

      На этом этапе формируются IP-пакеты, которые содержат все необходимые данные для доставки по сети.

    • MAC-адрес

      Уникальный идентификатор, назначенный сетевому адаптеру какого-либо устройства.

🔗 Ссылки на материалы
  1. Модель и стек протоколов TCP/IP — YouTube
  2. What is TCP/IP? YouTube
  3. Протокол TCP — YouTube
  4. Протокол UDP — YouTube
  5. Всё, что вы хотели знать о МАС адресе — habr.com
  • IPv4 и IPv6

    IPv4-IPv6

    IPv4 и IPv6 соответственно 4 и 6 версии IP-протокола. IPv4 разработана в 1981 году и ограничивает адресное пространство около 4.3 млрд (2^32) возможными уникальными адресами. Со временем распределение адресного пространства стало происходить значительно более быстрыми темпами, что вынудило создание новой версии IP-протокола для хранения большего количества адресов. IPv6 способен выдать более 300 млн уникальных IP-адресов на каждого жителя Земли.

🔗 Ссылки на материалы
  1. Протоколы IPv4 и IPv6. В чем разница и что лучше?
  • Проблемы сети

    Problems

    Качество работы сетей, и тем более интернета, далеко от идеала. Это обусловлено сложной и рассредоточенной по разным устройствам структурой сети. Поэтому на функционирование сети влияет огромное количеств факторов. Например: стабильность соединения между устройством клиента и его роутером, качество услуг провайдера, мощность и производительность сервера, физическое расстояние между клиентом и сервером и т.д.

🔗 Ссылки на материалы
  1. Лаги, джиттер и потеря пакетов: откуда берутся проблемы с неткодом и как их решать habr.com
  2. Внутренние механизмы ТСР, влияющие на скорость загрузки: часть 1 habr.com
  3. Внутренние механизмы ТСР, влияющие на скорость загрузки: часть 2 habr.com
  • Диагностика сети

    Traceroute

    • Трассировка сетевого маршрута

      Процедура, позволяющая отследить по каким узлам, с какими IP адресами, передаётся отправленный вами пакет прежде чем он достигнет точки назначения. Трассировка может применяться для выявления связанных с работой компьютерной сети проблем, а также для исследования/анализа сети.

    • Ping-сканирование

      Самый простой способ проверить сервер на работоспособность.

    • Проверка на потерю пакетов
🔗 Ссылки на материалы
  1. Как находить проблемы с интернетом и кто виноват: часть 1 habr.com
  2. Как находить проблемы с интернетом и кто виноват: часть 2 habr.com
  3. Прочитай и сделай: проводим сканирование сети самостоятельно habr.com
  4. Трассировка сетевого маршрута — hackware.ru

Операционные системы

Операционная система (ОС) это комплексная программная система, которая предназначена для управления ресурсами компьютера. Благодаря операционным системам людям не приходится иметь дело непосредственно с процессором, оперативной памятью или другими комплектующими ПК.

На данном этапе нет необходимости в детальном изучении устройства и принципов работы ОС. Достаточно лишь общего понимания, как в целом функционирует вся эта система, чтобы для вас это не было каким-то чёрным ящиком.

  • Как работают ОС

🔗 Ссылки на материалы
  1. Что такое операционная система и как она работает YouTube
  2. Что такое операционная система и как она работает? GitHub
  • Управление процессами

🔗 Ссылки на материалы
  1. Процесс Википедия
  2. Процессы и потоки
  • Потоки и параллелизм

🔗 Ссылки на материалы
  1. Поток выполнения Википедия
  2. Параллелизм против многопоточности против асинхронного программирования: разъяснение habr.com
  • Управление памятью

🔗 Ссылки на материалы
  1. Управление памятью в ОС
  • Межпроцессорное взаимодействие

🔗 Ссылки на материалы
  1. Межпроцессное взаимодействие Википедия
  2. IPC: основы межпроцессного взаимодействия
  • Ввод и вывод (I/O)

🔗 Ссылки на материалы
  1. Ввод и вывод Википедия
  2. Основные методы ввода-вывода (I/O) tproger.ru
  • Основы POSIX

🔗 Ссылки на материалы
  1. POSIX Википедия
  2. Что такое POSIX

Основы Linux

Операционные системы на базе ядра Linux это стандарт в мире серверной разработки, поскольку большинство серверов работают именно на таких ОС. Использовать Linux на серверах выгодно, ведь он рапространяется бесплатно.

Существует огромное количество дистрибутивов (сборок с набором предустановленного ПО) Linux на любой вкус и цвет. Одним из самых популярных является Ubuntu. Именно с него можно начать своё погружение в серверную разработку.

Установить Ubuntu можно на отдельный ПК или ноутбук. Если такой возможности нет, можно воспользоваться специальной программой Virtual Box, в которой можно запускать другие ОС поверх основной. Так же можно запустить Docker контейнер с образом Ubuntu (Docker - это отдельная тема, которая рассматривается в этом репозитории).

После этого можно быстро пройти вводный курс по Linux и Bash.

  • Работа с терминалом

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

    • Основные команды для навигации по файловой системе
      ls # просмотр содержимого директории
      cd <путь> # переход в указанный каталог
      cd .. # переход на уровень выше (в родительский каталог)
      touch <файл> # создание файла
      cat > <файл> # ввод текста в файл из консоли (перезапись)
      cat >> <файл> # ввод текста в конец файла (добавление)
      cat/more/less <файл> # просмотр содержимого файла
      head/tail <файл> # просмотр первых/последних строк файла
      pwd # путь к текущей директории
      mkdir <имя> # создать директорию
      rmdir <имя> # удалить директорию
      cp <файл> <путь> # копировать файл или директорию
      mv <файл> <путь># перемещение или переименование
      rm <файл> # удаление файла или директории
      find <строка># поиск в файловой системе
      du <файл># вывод размера файла или каталога
      
    • Команды для получения справочной информации
      man <названиеоманды> # позволяет посмотреть руководство по любой команде.
      apropos <слово> # поиск команды с описанием имеющим указанное слово
      man -k <слово> # аналогично команде выше
      whatis <названиеоманды> # краткое описание команды
      
    • Права суперпользователя

      Аналог запуска от имени администратора в Windows.

      sudo <команда> # выполняет команду с правами суперпользователя
      
🔗 Ссылки на материалы
  1. Основные linux-команды для новичка habr.com
  2. 44 команды Linux которые вы должны знать losst.ru
  • Менеджер пакетов

    Встроенный менеджер пакетов apt (advanced packaging tool) позволяет устанавливать/обновлять программные пакеты из сети с помощью терминала.

    • Базовые команды
      apt install <имя_пакета> # установить пакет
      apt remove <имя_пакета> # удалить пакет, но оставить конфигурацию
      apt purge <имя_пакета> # удалить пакет вместе с конфигурацией
      apt update # обновление информации о новых версиях пакетов
      apt upgrade # обновление пакетов, установленных в системе
      apt list --installed # список установленных в системе пакетов
      apt list --upgradable # список пакетов, которые требуют обновления
      apt search <имя> # поиск пакетов по имени в сети
      apt show <имя_пакета> # информация о пакете
      
🔗 Ссылки на материалы
  1. Как пользоваться apt losst.ru
  2. Использование APT. Команды apt и apt-get pingvinus.ru
  • Скрипты Bash

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

🔗 Ссылки на материалы
  1. Bash-скрипты: начало habr.com
  2. Шпаргалка оп Bash quickref.me
  • Пользователи

    ОС на базе Linux являются многопользовательскими. Это означает, что несколько людей могут запускать множество различных приложений одновременно на одном и том же компьютере. Чтобы система Linux смогла «узнать» пользователя, он должен войти в систему, соответсвенно каждый пользователь должен иметь уникальное имя и секретный пароль.

    • Работа с пользователями
      useradd <имя> [ключи] # создать нового пользователя
      passwd <имя> # установить пароль пользователю
      usermod <имя> [ключи] # редактировать пользователя
      usermod -L <имя> # заблокировать пользователя
      usermod -U <имя> # разблокировать пользователя
      userdel <имя> [ключи] # удалить пользователя
      
    • Работа с группами
      groupadd <группа> [ключи] # создать группу
      groupmod <группа> [опции] # редактировать группу
      groupdel <группа> [опции] # удалить группу
      usermod -a -G <группы(через запятую)> <пользователь> # добивить пользователя в группы
      gpasswd --delete <пользователь> <группы(через запятую)> # удалить пользователя из групп
      
    • Системные файлы
      /etc/passwd # файл паролей, содержащий основную информацию о пользователях
      /etc/shadow # файл теневых шифрованных паролей, содержащий зашифрованные пароли
      /etc/group # файл групп, содержащий основную информацию о группах
      /etc/gshadow # файл теневых групп, содержащий шифрованные пароли групп
      
🔗 Ссылки на материалы
  1. Пользователи в Linux: добавление, изменение, удаление
  2. Группы и пользователи в Linux
  • Права доступа

    chmod

    Так как под одной ОС могут работать несколько разных пользователи, то соответственно у каждого такого пользователя будет своё личное файловое пространство. Отсюда вытекает, что у любого файла в Linux должны быть специальные атрибуты права на доступ. Эти атрибуты должны сообщать, кто имеет право работать c тем или иным файлом.

🔗 Ссылки на материалы
  1. Права доступа в Linux younglinux.info
  2. Управление доступом в Linux
  3. Команда chmod изменение прав доступа younglinux.info
  • Работа с процессами

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

    • Базовые команды
      ps # вывести 'снимок' процессов всех пользователей
      top # диспетчер задач в реальном времени
      <команда> & # запуск процесса в фоновом режиме, то есть не занимая консоль
      jobs # список запущенных в фоновом режиме процессов
      fg <номер> # вернуть процесс обратно в активный режим по его номеру
      bg <номер> # запуск остановленного процесса в фоновый режим
      kill <id процесса> # завершить процесс по id
      killall <программа> # завершить все процессы связанные с одной программой
      
🔗 Ссылки на материалы
  1. Работа с процессами в Linux YouTube
  2. Шпаргалка по работе процессами в Linux
  • Работа с SSH

    Служба SSH Позволяет получить удаленный доступ к терминалу другого компьютера. В случае с персональным компьютером, это может понадобиться для срочного решения какой-либо проблемы, а в случае с сервером это вообще очень распространенная практика.

    • Базовые комнады
      apt install openssh-server # установка SSH (хотя он почти везде идёт из коробки)
      service ssh start # запуск SSH
      service ssh stop # остановка SSH
      ssh -p <Порт> user@remotehost # подключенние к удаленному ПК через SSH
      ssh-keygen -t rsa # генерация RSA-ключа для беспарольного входа
      ssh-copy-id -i ~/.ssh/id_rsa user@remotehost # копирования ключа на удаленную машину
      
🔗 Ссылки на материалы
  1. Как пользоваться SSH losst.ru
  • Планировщик задач

    cron

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

🔗 Ссылки на материалы
  1. Использование Cron для автоматизации задач Digital Ocean
  2. Crontab: запуск задач по расписанию YouTube
  3. Удобный онлайн-редактор для crontab
  • Системные логи

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

🔗 Ссылки на материалы
  1. Как посмотреть логи в Linux losst.ru
  2. Лог файлы Linux по порядку habr.com
  3. Туториал по системным логам Linux
  • Проблемы Linux

Общие знания

  • Системы счисления

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

    Binary

    • Двоичная СС

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

    Octal

    • Восьмиричная СС

      Используется, например, в Linux-системах для выдачи прав доступа.

    • Десятичная СС

      СС которая удобная для восприятия большинству людей.

    Hex

    • Шестнадцатеричная СС

      Для записи используются дополнительно буквы: A, B, C, D, E, F. Широко используется в низкоуровневом программировании и компьютерной документации из-за, того что минимальной адресуемой единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами.

    • Перевод из одной СС в другую

      Для лучшего понимания можно попробовать онлайн конвертер


🔗 Ссылки на материалы
  1. Двоичная система счисления. Самое простое объяснение YouTube
  2. Перевод чисел между системами счисления YouTube
🔗 Ссылки на материалы
  1. Конъюнкция, дизъюнкция, импликация, эквиваленция, отрицание. На примерах из жизни YouTube
  • Структуры данных

    Структуры данных (СД) это контейнеры в которых данные хранятся по определенным правилам. В зависимости от этих правил структура данных будет эффективна в одних задачах и неэффективна в других. Поэтому необходимо понимать, когда и где использовать ту или инную структуру.

    • Массив

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

    • Связный список

      СД где все элементы, помимо данных, содержат ссылки на последующий и/или предыдущий элемент. Существуют 3 разновидности:

      • Односвязный список СД, где каждый элемент хранит ссылку только на следующий (одно направление).
      • Двусвязный список СД, где элементы содержат ссылки, как на следующий элемент, так и на предыдущий (два направления).
      • Кольцевой спискок разновидность двусвязного списка, где последний элемент кольцевого списка содержит указатель на первый, а первый — на последний.
    • Стек

      СД где хранение данных работает по принципу "последним пришел первым вышел".

    • Очередь

      СД где хранение данных происходит по принципу "первым пришел первым вышел".

    • Хеш-таблица
    • Дерево

      СД с иерархической моделью, в виде набора связанных между собой элементов.

    • Куча

      СД где элемент с наибольшим ключом всегда является корневым узлом кучи.

    • Граф

🔗 Ссылки на материалы
  1. 8 структур данных, которые должен знать каждый программист
  • Базовые алгоритмы

    Алгоритмы подразумевают под собой наборы последовательных инструкций (шагов), которые приводят к решению поставленной задачи. За всю человеческую историю было придумано огромное количество алгоритмов, которые позволяют решать определенные задачи максимально эффективным способом. Соответственно правильный выбор алгоритмов в программировании позволит создавать максимально быстрые и ресурсоемкие решения.

    Существует очень хорошая книжка по алгоритмам Грокаем алгоритмы. С ней можно параллельно начать изучение языка программирования.



    Если вам интересно узнать больше, то рекомендую заглянуть в этот репозиторий, где собрана огромная коллекция алгоритмов.

  • Оценка сложности алгоритмов

    В мире программирования существует специальная единица измерения Big О (Большое О или О-нотация). Она описывает как сложность алгоритма растёт с увеличением количества входных данных. Дело в том, что один и тот же алгоритм запущенный на разных устройствах выполняется за разное время (завист от производительности устройства). Поэтому такая оценка не может быть релевантной. Вместо этого в Big O алгоритм оценивается по тому, сколько действий (шагов/итераций) необходимо совершить для его выполнения, при этом всегда показывая худший вариант развития событий.

    BigO

    • Основные разновидности сложности алгоритмов
      • Константная - O(1)
      • Линейная - O(n)
      • Логарифмическая - O(log n)
      • Линеарифметическая - O(n * log n)
      • Квадратичная - O(n^2)
      • Степенная - О(2^n)
      • Факториальная - O(!n)
🔗 Ссылки на материалы
  1. Сложность алгоритмов. Big O. Основы
  2. Шпарглака по Big O
  • Форматы хранения данных

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

    • Текстовые форматы

      • JSON (JavaScript Object Notation)

        Представляет из себя объект, в котом данные хранятся в виде пар ключ-значение.

      • YAML (Yet Another Markup Language)

        Формат близкий к языкам разметки по типу HTML. Минималистичный, поскольку не имеет открывающих и закрывающих тегов. Удобный для редактирования.

      • XML (eXtensible Markup Language)

        Формат более близкий к HTML. Здесь данные оборачиваются в открывающие и закрывающие теги.

    • Бинарыне форматы

      • Message Pack

        Бинарный аналог JSON. Позволяет упаковывать данные на 15-20% эффективнее.

      • BSON (Binary JavaScript Object Notation)

        Является надмножеством JSON, включая дополнительно регулярные выражения, двоичные данные и даты.

      • ProtoBuf (Protocol Buffers)

        Бинарная альтернатива текстовому формату XML. Проще, компактнее и быстрее.

🔗 Ссылки на материалы
  1. Форматы сериализации данных habr.com

Язык программирования

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

Ниже приведен список конкретных языков, которые лично по моему мнению хорошо подходят для backend-разработки (⚠️ может не совпадать с мнением других людей, в том числе более компитентных в этом вопросе).

Python - очень популярный и широко используемый. Лёгкий в изучении, благодаря простому синтаксису.

JavaScript - не менее популярный и практический единственный язык для полноценной Web-разработки. Благодаря платформе Node.js последнее несколько лет набирает популярность и в области backend-разработки.

Go - язык созданный внутри компании Google. Создавался специально для высоконагруженной серверной разработки. Минималистичный синтаксис, высокая производительность и богатая стандартная библиотека.

После того как вы определились с ЯП, советую поискать специальный awesome-репозиторий ресурс в котором собрано огромное количество полезных ссылок на материалы под Ваш ЯП (библиотеки, шпаргалки, блоги, сайты и т.д).

В будущем здесь будет подробно рассмотрен один из языков

  • Классификация языков программирования

    Языков программирования много. Все они созданы не просто так. Некоторые языки могут быть совсем специфическими и использоваться только для определенных целей. Также, разные языки могут использовать разные подходы к написанию программ. А могут вообще по разному исполняться на компьютере. В общем существует множество различных классификаций, в которых было бы полезно разобраться.

🔗 Ссылки на материалы
  1. Языки программирования: критерии выбора YouTube
🔗 Ссылки на материалы
  1. Методы программирования GitHub
  • Основы языка

    Под основами подразумеваются некоторые фундаментальные идеи, присутствующие в каждом ЯП.

    • Переменные и константы
    • Типы данных

      Строки, целые числа, дробные числа, boolean и т.д.

    • Операторы

      Математические операторы, операторы сравнения, побитовые операторы.

    • Функции

      Работа с аргументами и возвращаемыми данными.
      Понимание области видимости переменных.

    • Управление потоком

      Циклы for, условия if else, switch-case.

    • Структуры данных

      Массивы, объекты, классы и т.д.

    • Стандартная библиотека

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

    • Регулярные выражения

      Мощный интсрумент для работы со строками. Обязательно ознакомтесь с этим в своем ЯП, хотя бы на базовом уровне.

🔗 Ссылки на материалы
  • Пакетный менеджер

🔗 Ссылки на материалы
🔗 Ссылки на материалы
  1. Принципы для разработки: KISS, DRY, YAGNI... habr.com
  2. Простое объяснение принципов SOLID habr.com
  3. Принципы SOLID, о которых должен знать каждый разработчик medium.com
  4. Что можно узнать о Domain Driven Design за 10 минут? habr.com
  5. GRASP паттерны проектирования habr.com

Программное обеспечение

  • Система контроля версий Git

    Git - специальная система для управления историей изменения исходного кода. Любые изменения которые вносятся в Git могут быть сохранены, что позволяет откатываться (возвращаться) на ранее сохраненную копию проекта. На данный момент Git является стандартом для разработки.

    • Основные команды
      git init # инициализация Git в текущей папке
      git add [файл] # добавить файл в Git
      git add . # добавить все файлы в папке в Git
      git reset [файл] # отменить добавление указанного файла
      git reset # отменить добавление всех файлов
      git commit -m "ваш текст" # создать коммит (сохранение)
      git status # показывает статус добавленных файлов
      git push # отправить текущие коммиты в удаленный репозиторий
      git pull # загрузить изменения с удаленного репозитория
      git clone [ссылка] # склонировать указанный репозиторий к себе на ПК
      
    • Работа с ветками

      Ветвление позволяет отклонятся от основной линии разработки и продолжать работу независимо.

      git branch # показать список текущих веток
      git branch [имя] # создать новую ветку от текущего коммита
      git checkout [имя] # переключиться на указанную ветку
      git merge [имя] # слияние указанной ветки в текущую ветку
      git branch -d [имя] # удалить указанную ветку
      
    • Отмена коммитов
      git revert HEAD --no-edit # создать новый коммит который отменяет изменения предыдущего
      git revert [хэш_коммита] --no-edit # то же действие, но с указанным коммитом
      
    • История изменений
      git log [ветка] # показать коммиты указанной ветки
      git log -3 # показать 3 последних коммита текущей ветки
      git log [файл] # показать историю коммитов указанного файла
      
🔗 Ссылки на материалы
  1. Шпаргалка по консольным командам Git GitHub
  2. Git. Большой практический выпуск YouTube
  • Docker

    Docker - специальная программа, которая позволяет запускать изолированные песочницы (контейнеры) с различным предустановленным окружением (будь-то определенная операционная система, база данных и т.д.). Технология контейнеризации, которую предоставляет Docker, схожа с виртуальными машинами. Но, в отличие от виртуальных машин, контейнеры не создают такой дополнительной нагрузки, поскольку используют ядро хостовой ОС.

    • Образ (image)

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

    • Контейнер (container)

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

    • Основные команды
      docker pull [имя_образа] # Загрузить образ из сети
      docker images  # Список доступных образов 
      docker run [id_образа] # Запуск контейнера на основе выбранного образа
          # Некоторые флаги для команды run:
          -d # Запуск с возвратом в консоль
          --name [имя] # Задать имя контейнеру
          --rm # Удалить контейнер после остановки
          -p [локальный_порт][порт_внутри_контейнера] # Проброс портов
      docker build [путь_к_Dockerfile] # Создание образа на основе Dockerfile
      docker ps # Список запущенных контейнеров
      docker ps -a # Список всех контейнеров
      docker stop [id/имя_контейнера] # Остановить контейнер
      docker start [id/имя_контейнера] # Запустить существующий контейнер
      docker attach [id/имя_контейнера] # Подключится к консоли контейнера
      docker logs [id/имя_контейнера] # Вывести логи контейнера
      docker rm [id/имя_контейнера] # Удалить контейнер
      docker container prune # Удалить все контейнеры
      docker rmi [id_образа] # Удалить образ
      
    • Инструкции Dockerfile

      Dockerfile представляет собой файл с набором инструкций и аргументов для создания образов.

      FROM [имя_образа] # Задание базового образа
      WORKDIR [путь] # Задание корневой директории внутри контейнера
      COPY [путь_относительно_Dockefile] [путь_в_контейнере] # Копирование файлов
      ADD [путь] [путь] # Аналогично команде выше
      RUN [команда] # Команда которая запускается только при инициализации образа
      CMD ["команда"] # Команда которая отрабатывает каждый раз при запуске контейнера
      ENV КЛЮЧ="ЗНАЧЕНИЕ" # Установка переменных окружения
      ARG ИМЯ=ЗНАЧЕНИЕ # Задание переменных для передачи Docker во время сборки образа
      ENTRYPOINT ["команда"] # Команда которая запускается во время работы контейнера
      EXPOSE порт/протокол # Указывает на необходимость открыть порт
      VOLUME ["путь"] # Создаёт точку монтирования для работы с постоянным хранилищем
      
    • Docker-compose

      Специальный инструмент позволяющий одновременно запускать несколько контейнеров с разной инфраструктурой. В каком-то смысле это Dockerfile на максималках.

🔗 Ссылки на материалы
  1. Полное практическое руководство по Docker habr.com
  2. Docker для Начинающих. Полный Курс YouTube
  3. Изучаем Docker: файлы Dockerfile habr.com
  4. Руководство по Docker Compose для начинающих habr.com
  • Postman/Insomnia

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

    • Postman

      Очень популярная и многофункциональная программа. Здесь точно есть всё, что Вам может пригодиться и даже больше: начиная от банального создания коллекций до поднятия mock-серверов. Основной функционал приложения предоставляется бесплатно.

    • Insomnia

      Не такой популярный, но очень приятный инструмент. Интерфейс в Insomnia, минималистичный и понятный. Здесь поменьше функционала, но все самое необходимое есть: коллекции, переменные, автоматические тесты и т.д. Имеется возможность установки сторонних плагинов.

🔗 Ссылки на материалы
  1. Уроки по тестированию в Postman (плейлист) YouTube
  2. Insomnia. Инструмент для API тестирования YouTube

Базы данных

База данных (БД) набор данных, которые организованы по определённым правилам. Например, библиотека является базой данных для книг.

Система управления базой данных (СУБД) программное обеспечение, которое позволяет создать БД и удобно ей манипулировать (выполнять различные операции над данными). Примером СУБД может являться библиотекарь. Он может легко и эффективно работать с книгами в библиотеке: выдавать запрашиваемые книги, принимать их обратно, добавлять новые и т.д.

  • Классификация баз данных

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

    • Реляционные БД (relation отношение, связь)

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

    • Объектно-ориентированные БД

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

    • Распределенные

      Состоят из нескольких частей, расположенных на разных компьютерах (серверах). Такие БД могут полностью исключать дублирование информации, либо полностью её дублировать в каждой распределенной копии (например, как блокчейн)

    • Нереляционные (NoSQL)

      Хранят и обрабатывают неструктурированные или слабоструктурированные данные. Этот тип БД подразделяется на подтипы:

🔗 Ссылки на материалы
  1. Зачем нужны базы данных
  2. Выбираем базу данных medium.com
  3. Базы данных: большой обзор типов и подходов habr.com
  4. Базы данных для программиста YouTube
  • Реляционная база данных

    Наиболее популярные реляционные БД: MySQL, PostgreSQL, MariaDB, Oracle.

    SQL (Structured Query Language) специальный язык для работы с реляционными базами данных. Он довольно простой и интуитивно понятный.

    Удобная документация по SQL на русском языке здесь.

    • Основы SQL

      Не забывайте про точку с запятой в конце каждой команды.

      • Создание новой БД
      CREATE DATABASE db_name;
      
      • Создание новой таблицы
      CREATE TABLE users ( 
          id SERIAL PRIMARY KEY, # Уникальный id
          firstName VARCHAR(100), # Строка
          lastName VARCHAR(100), # Строка
          age INT, # Число
          gender VARCHAR(10), # Строка 
          isMarried BOOLEAN # true/false
      );        
      
      • Основыне типы данных
        • INT (целые числа от -2^32 до +2^32)
        • FLOAT / DOUBLE / DECIMAL (дробные числа)
        • CHAR / VARCHAR / TEXT (строки)
        • DATA / DATETIME / TIME (дата и время)
        • ENUM (перечисления - списки допустимых значений)
        • И другие
      • Добавление данных в таблицу
      INSERT INTO users(
          firstName, lastName, age, gender, isMarried
      ) VALUES (
          'Alex', 'Manson' 25, 'male', false
      );
      
      • Выборка данных из таблицы
      # SELECT
      ## Получить всю таблицу users
      SELECT * FROM users; 
      ## Получить только столбцы firstName и age из таблицы users
      SELECT firstName, age FROM users; 
      
      # LIMIT
      ## Получить первых 20 записей таблицы users
      SELECT * FROM users LIMIT 20;
      
      # DISTINCT
      ## Получить только уникальные значения из столбца firstName
      SELECT DISTINCT(firstName) FROM users;
      
      # WHERE
      ## Записи, где столбец gender = 'male'
      SELECT * FROM users WHERE gender = 'male'; 
      ## AND, OR 
      SELECT * FROM users WHERE age = 25 AND isMarried = falsel
      SELECT * FROM users WHERE age = 20 OR age = 50;
      
      # BETWEEN
      ## Записи, где значения столбца age находятся в промежутке от 20 до 30
      SELECT * FROM users WHERE age BETWEEN 20 AND 30;
      
      #NULL
      ## Записи, где столбец lastName не пуст
      SELECT * FROM users WHERE lastName IS NOT NULL;
      
      • Поиск данных по шаблону
      # IN, LIKE, NOT LIKE
      ## % - подстановочный знак, который указывает на любое кол-во символов
      ## _ - подстановочный знак, который указывает на один символ
      
      ## Записи, где firsName равен 'John', 'Mike' или 'Kane'
      SELECT * FROM users WHERE firstName IN ('John', 'Mike', 'Kane');
      ## Записи, где firsName начинается c буквы 'A'
      SELECT * FROM users WHERE firstName LIKE 'A%';
      ## Записи, где первая буква в firstName равна 'A', 'B' или 'C'
      SELECT * FROM users WHERE firstName LIKE '[ABC]%';
      ## Записи, где вторая буква в firsName не равна 'o'
      SELECT * FROM users WHERE firstName NOT LIKE '_o%';
      
      • Сортировка и фильтрация данных таблиц
      # ORDER BY
      ## ASC - по возрастанию (по умолчанию)
      ## DESC - по убыванию
      SELECT * FROM users ORDER BY firstName ASC;
      SELECT * FROM users ORDER BY age DESC;
      SELECT * FROM users ORDER BY lastName DESC, isMarried ASC;
      
      # HAVING
      ## Фильтрация результатов группировки
      
      • Использование псевдонимов
      # AS
      SELECT firstName AS name FROM users WHERE name = "Alex";
      
      • Изменение таблиц
      # ALTER TABLE
      ## Добавить новую колонку city к таблицe users
      ALTER TABLE users ADD COLUMN city VARCHAR(50); 
      ## Удалить колонку isMarried из тиблицы users
      ALTER TABLE users DROP COLUMN isMarried;
      ## Переименовать колокнку firstName в fName в таблицe users
      ALTER TABLE users RENAME COLUMN firstName TO fName;
      ## Переименовать таблицу users в consumers
      ALTER TABLE users RENAME TO consumers;
      
      • Изменение данных в таблице
      # UPDATE
      ## Изменить в таблицe users записть с id = 1
      UPDATE users SET firstName = 'Kale', age = 33 WHERE id = 1;
      ## Изменить записи, где gender = 'female'
      UPDATE users SET city = 'Paris' WHERE gender = 'famale';
      
      • Удаление данных из таблицы
      # DELETE
      # Удалить запись в таблице users, где id = 2
      DELETE FROM users WHERE id = 2;
      # Удалить все записи в таблице users, где gender = 'male'
      DELETE FROM users WHERE gender = 'male';
      
    • Агрегатные функции

      Используются для обобщения/подсчёта данных.

      # COUNT
      ## Возвращает количество элементов в таблице users
      SELECT COUNT(*) FROM users;
      ## Возвращает количество не повторяющихся значений столбца firstName
      SELECT COUNT(DISTINCT(firstName)) FROM users;
      
      # MAX, MIN
      SELECT MAX(age) FROM users;
      SELECT MIN(age) FROM users;
      
      # SUM
      # Сумма всех значений столбца age
      SELECT SUM(age) FROM users;
      
      # AVG
      ## Среднее значение столбца age
      SELECT AVG(age) FROM users;
      
    • Объединение таблиц
      • Запрос данных из нескольких таблиц

        Оператор JOIN; Комбинации с другими операторами; типы JOIN: (внешние/внутренние, левое/правое, перекресные, полные)

      • Свзяи между таблицами

        Ссылки из одной таблицы на другую; внешние ключи (FOREIGN KEY)

    • Подзапросы

      Запрос внутри другого запроса SQL

    • Индексы

      Структура данных, позволяющая быстро определить положение интересующих данных в базе.

    • Транзакции

      Последовательности команд, которые должны быть выполнены полностью, либо не выполнены вообще.

      • Команда START TRANSACTION
      • Команды COMMIT и ROLLBACK
    • Работа с языком программирования

      Для этого необходимо установить библиотеку под ваш ЯП. Для более удобной работы существуют ORM-библиотеки, которые позволяют выполнять SQL-запросы, как если бы вы просто вызывали методы у объекта.

🔗 Ссылки на материалы
  1. Основы SQL (плейлист) YouTube
  2. Практика SQL (плейлист) YouTube
  • MongoDB

    MongoDB документоориентированная БД (является классическим примером NoSQL баз данных), не требующая описания схемы таблиц. Использует JSON-подобные документы и схему БД.

    • Основные команды
      • Подготовка БД
      show dbs // показать список всех БД
      use db_name // подкючится/создать БД с именем db_name
      db // вывести имя текущей базы данных
      db.createCollection("users") // создать коллекцию "notes"
      show collections // показать список коллекций в текущей БД
      db.dropDatabase() // удалить текущую БД
      
      • Добавление элементов
      // Добавить один элемент
      db.users.insertOne({
          name: "Alex",
          age: 27,
          isMarried: false,
          city: "NewYork"
      })
      
      // Добавить несколько элементов
      db.users.insertMany([{...}, {...}])
      
      • Получение элементов
      // Получить все элементы из коллекции
      db.users.find() 
      // Получить элементы по указанному критерию
      db.user.find({age: 27})
      // Получить один элемент
      db.users.findOne({name: "Alex"})
      // Получить отсортированный список элементов
      // 1 - по возрастанию; -1 - по убыванию
      db.users.find().sort({age: 1}) 
      // Получить количество элементов
      db.users.find().count()
      // Лимит количества получаемых элементов
      db.users.find().limit(10)
      // Выборка с помощью операторов сравнения
      db.users.find({age: {$gt: 20}})  // > 20
      db.users.find({age: {$gte: 20}}) // >= 20
      db.users.find({age: {$lt: 50}})  // < 50
      db.users.find({age: {$lte: 50}}) // <= 50
      db.users.find({age: {$ne: 35}})  // != 35
      
      • Изменение элементов
      // Полное изменение элемента (первый аргрумент - критерий поиска)
      db.users.updateOne({name: "Alex"}, {новыеанные})
      // Изменение определенных полей элемента
      db.users.updateOne({name: "Alex"}, {$set: {age: 28, isMarried: true}})
      // Переименовать поле у нескольких элементов
      db.users.updateMany({name: "Alex"}, {&rename: {city: "town"}})
      // Удаление элемента/элементов
      db.users.deleteOne({name: "Alex"})
      db.users.deleteMany({name: "Alex"})
      
    • Агрегации

      Группировка значений из нескольких документов.
      Три способа выполнения агрегации: pipeline, Map-Reduce и одноцелевые методы агрегирования.

    • Работа с индексами
    • Работа с языком программирования

      Для этого необходимо установить драйвер MongoDB под ваш ЯП.

🔗 Ссылки на материалы
  1. Руководство по MongoDB metanit.com
  2. Большой курс по MongoDB: Агрегация medium.com
  3. Большой курс по MongoDB: Индексация medium.com
  • Проблемы баз данных

Разработка API

  • REST API

  • Аунтификация и авторизация

    • Cookie авторизация
    • JWT (Json Web Token)
    • OAuth
  • GraphQL

  • WebSockets

  • gRPC

Кэширование

  • CDN

  • Client side

  • Redis

  • Memcached

Безопасность

  • Криптография

    • Хэши и хеш-функции

    • Цифровые подписи

    • Соль для подписей

    • Коллизия хэшей

  • Content Security Policy

  • SSL/TLS

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

  • Unit-тесты

  • Интеграционные тесты

  • Функциональные тесты

  • E2E тесты

Построение архитектуры

🔗 Ссылки на материалы
  1. Паттерны ООП в метафорах habr.com
  2. Шпаргалка по шаблонам проектирования habr.com

Дополнительные ресурсы

Made with ♥
LICENSE 2022