# Backend cheats Данный репозиторий представляет собой наглядную шпаргалку по основным темам в области Backend-разработки. Весь материал разбит на темы и подтемы. Структура материала состоит из 3 частей: - **Визуальная часть** - различные изображения/таблицы для лучшего понимания (может отсутствовать). Все рисунки и таблицы сделаны с нуля, специально для этого репозитория. - **Краткое описание** - очень краткая выжимка информации, позволяющая понять лишь основную суть. - **Ссылки на источники** - ресурсы, где можно найти полную информацию по конкретному вопросу. По возможности мы стараемся указывать максимально авторитетные источники, либо же те, которые предоставляют информацию максимально простым и понятным языком. Изучать материал можно последовательно шаг за шагом. > 🛠 Репозиторий находится в стадии активной разработки, поэтому постоянно обновляется и дополняется > 🤝 Если вы хотите помочь проекту, не стесняйтесь присылать свои пулл реквесты > 📝 The translation into English will be start after all the main topics have been completed

## Содержание - [1. Сеть и интернет](#сеть-и-интернет) - [Как устроен интернет](#как-устроен-интернет) - [Браузеры и как они работают](#браузеры-и-как-они-работают) - [Что такое DNS](#что-такое-dns) - [Что такое доменное имя](#что-такое-доменное-имя) - [Хостинг](#хостинг) - [Cтек протоколов TCP/IP](#cтек-протоколов-tcpip) - [Проблемы сети](#проблемы-сети) - [IPv4 и IPv6](#ipv4-и-ipv6) - [Трассировка маршрутов](#трассировка-маршрутов) - [2. Операционные системы](#операционные-системы) - [Как работают ОС](#как-работают-ос) - [Управление процессами](#управление-процессами) - [Потоки и параллелизм](#потоки-и-параллелизм) - [Управление памятью](#управление-памятью) - [Межпроцессорное взаимодействие](#межпроцессорное-взаимодействие) - [Ввод и вывод (I/O)](#ввод-и-вывод-io) - [Основы POSIX](#основы-posix) - [3. Основы Linux](#основы-linux) - [Работа с терминалом](#работа-с-терминалом) - [Менеджер пакетов](#менеджер-пакетов) - [Скрипты Bash](#скрипты-bash) - [Пользователи](#пользователи) - [Права доступа](#права-доступа) - [Работа с процессами](#работа-с-процессами) - [Работа с SSH](#работа-с-ssh) - [Планировщик задач](#планировщик-задач) - [Системные логи](#системные-логи) - [Проблемы Linux](#проблемы-linux) ## Сеть и интернет **Интернет** - это всемирная система объединяющая компьютерные сети со всего мира в единую сеть для хранения/передачи информации. Изначально Интернет разрабатывался для нужд военных. Но вскоре он стал внедряться в учреждения образования (университеты), а затем его смогли использовать частные компании, которые начали организовывать сети провайдеров, предоставляющие услуги доступа в Интернет обычным гражданам. К началу 2020 года количество пользователей в сети Интернет перевалило за 4.5 млрд человек. [Интернет — Википедия](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82) [История Интернета — Википедия](https://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%D0%B0) - ### Как устроен Интернет

Internet

Ваш компьютер никогда не был связан с Интернетом напрямую. Он видит только свою локальную сеть, в которую проводным (Ethernet) или беспроводным (Wi-Fi, Bluetooth) путем подключены другие устройства. Для связи с Интернетом в вашей локальной сети находиться специальный мини-компьютер - **маршрутизатор**. Далее этот маршрутизатор связывает вас с интернет-провайдером, который в свою очередь связан с другими провайдерами более высокого уровня. Таким образом, ваше сообщение, пройдя транзитом через сеть нескольких провайдеров, достигнет сеть назначения. `Хост` _(host - принимающий)_ - любое устройство, которое находится в какой-либо сети. `Сервер` _(serve - обслуживать)_ - специальный компьютер в сети, который обслуживает запросы поступающие от других компьютеров. [Как работает Интернет - MDN (mozilla.org)](https://developer.mozilla.org/ru/docs/Learn/Common_questions/How_does_the_Internet_work) [Основы программирования. Как работают сети? - YouTube](https://www.youtube.com/watch?v=k_0BAtyaDio&ab_channel=Winderton) [Хост — что это такое и как он работает](https://anisim.org/articles/host/) [Сервер — Википедия]() [Что такое сервер и как он работает](https://timeweb.com/ru/community/articles/chto-takoe-server-i-kak-on-rabotaet)
Содержание ⬆️
- ### Браузеры и как они работают

Browser

Браузер - это клиент, с помощью которого можно отправлять запросы на сервер для получения файлов, которые впоследствии используются для отрисовки web-страниц. Большинство пользователей используют именно браузеры для работы в сети Интернет. [Как работают браузеры — MDN (mozilla.org)](https://developer.mozilla.org/ru/docs/Web/Performance/How_browsers_work) [Браузер — Википедия](https://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80)
Содержание ⬆️
- ### Что такое DNS

DNS

**DNS (Domain Name System)** - это децентрализованная система именования адресов в Интернете, которая позволяет создавать удобные для человека буквеные наименования (доменные имена) соответствующие числовым IP-адресам, которые используются компьютерами. `IP-адрес` - уникальный идентификатор устройства находящегося в какой-либо сети. [Система доменных имен DNS — YouTube](https://www.youtube.com/watch?v=B0J0c0KLtbQ&ab_channel=AndreySozykin) [DNS — Википедия](https://ru.wikipedia.org/wiki/DNS) [IP адрес — HackWare.ru](https://hackware.ru/?p=11589) [IP-адрес — Википедия](https://ru.wikipedia.org/wiki/IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81)
Содержание ⬆️
- ### Что такое доменное имя

Domain

Доменные имена представляют собой человеко-читаемые адреса веб-серверов, доступных в Интернете. Они состоят из частей (уровней) разделенных между собой точкой. Каждая из этих частей предоставляет специфическую информацию о доменном имени. Например страну, название сервиса, локализацию и т.д. [Что такое доменные имена - MDN (mozilla.org)](https://developer.mozilla.org/ru/docs/Learn/Common_questions/What_is_a_domain_name) [Как работают домены](https://temoto.github.io/a/kak-rabotayut-domeny.html)
Содержание ⬆️
- ### Хостинг

Hosting

**Хостинг** _(hosting)_ - специальная услуга, предоставляемая хостинг-провайдерами, которая позволяет арендовать пространство на сервере (который круглосуточно подключён к сети Интернет), где могут храниться ваши данные и файлы. Существуют различные варианты хостинга, где вы можете использовать не только дисковое пространство сервера, но и так же процессорную мощность для работы ваших сетевых приложений. [Хостинг: варианты, сравнения, пользовательская статистика — habr.com](https://habr.com/ru/company/ruvds/blog/443522/) [Хостинг: что это, зачем и как выбрать – vc.ru](https://vc.ru/services/74241-hosting-chto-eto-zachem-i-kak-vybrat)
Содержание ⬆️
- ### Cтек протоколов TCP/IP

TCP/IP

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

TCP

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

UDP

`UDP` - это простой протокол с быстрой передачей данных. Он не использует механизмов для гарантирования доставки и порядка следования данных. Используется, например в онлайн-играх, где частичная потеря пакетов не критична, но скорость передачи данных имеет гораздо более важное значение. Так же, запросы к DNS-серверам происходят через UDP протокол. `MAC-адрес` - уникальный идентификатор, назначенный сетевому адаптеру какого-либо устройства. [Модель и стек протоколов TCP/IP — YouTube](https://www.youtube.com/watch?v=UZo4ffQ-aAc&list=PLtPJ9lKvJ4oiNMvYbOzCmWy6cRzYAh9B1&index=8&ab_channel=AndreySozykin) [Протокол TCP — YouTube](https://www.youtube.com/watch?v=CKUOb4htnB4&ab_channel=AndreySozykin) [Протокол UDP — YouTube](https://www.youtube.com/watch?v=GBrLfZvRrd8&ab_channel=AndreySozykin) [TCP/IP — Википедия](https://ru.wikipedia.org/wiki/TCP/IP) [Всё, что вы хотели знать о МАС адресе — habr.com](https://habr.com/ru/post/483670/)
Содержание ⬆️
- ### Проблемы сети
Содержание ⬆️
- ### IPv4 и IPv6

IPv4-IPv6

IPv4 и IPv6 соответственно 4 и 6 версии IP-адреса. IPv4 разработана в 1981 году и ограничивает адресное пространство около 4.3 млрд (2^32) возможными уникальными адресами. Но со временем распределение адресного пространства стало происходить значительно более быстрыми темпами, что вынудило создание новой версии IP-адреса для хранения большего количества адресов. IPv6 способен обеспечить более 300 млн IP-адресов на каждого жителя Земли. [IPv4 — Википедия](https://ru.wikipedia.org/wiki/IPv4) [IPv6 — Википедия](https://ru.wikipedia.org/wiki/IPv6) [Протоколы IPv4 и IPv6. В чем разница и что лучше?](https://bezopasnik.info/%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B-ipv4-%D0%B8-ipv6-%D0%B2-%D1%87%D0%B5%D0%BC-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0-%D0%B8-%D1%87%D1%82%D0%BE-%D0%BB%D1%83%D1%87%D1%88%D0%B5/)
Содержание ⬆️
- ### Трассировка маршрутов

Traceroute

**Трассировка маршрута** - процедура, позволяющая отследить по каким узлам, с какими IP адресами, передаётся отправленный вами пакет прежде чем он достигнет точки назначения. Трассировка может применяться для выявления связанных с работой компьютерной сети проблем, а также для исследования/анализа сети. [Трассировка сетевого маршрута — hackware.ru](https://hackware.ru/?p=9210#12) [Traceroute — Википедия](https://ru.wikipedia.org/wiki/Traceroute)
Содержание ⬆️
## Операционные системы Операционная система (ОС) – это комплексная программная система, которая предназначена для управления ресурсами компьютера. На данном этапе нет необходимости в детальном изучении устройства и принципов работы ОС. Достаточно лишь общего понимания, как в целом функционирует вся эта система, чтобы для вас это не было каким-то черным ящиком. - ### Как работают ОС [Что такое операционная система и как она работает – YouTube](https://www.youtube.com/watch?v=hb9CTGSJm88&t) [Что такое операционная система и как она работает? - GitHub](https://github.com/Steindvart/My_study/blob/master/docs/source/OS/articles/what_is_os.rst)
Содержание ⬆️
- ### Управление процессами [Процесс – Википедия]() [Процессы и потоки](https://learnc.info/c/processes_and_threads.html)
Содержание ⬆️
- ### Потоки и параллелизм [Поток выполнения – Википедия](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F) [Параллелизм против многопоточности против асинхронного программирования: разъяснение – habr.com](https://habr.com/ru/post/337528/)
Содержание ⬆️
- ### Управление памятью [Управление памятью в ОС](https://bestprogrammer.ru/izuchenie/upravlenie-pamyatyu-v-operatsionnoj-sisteme)
Содержание ⬆️
- ### Межпроцессорное взаимодействие [Межпроцессное взаимодействие – Википедия](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5) [IPC: основы межпроцессного взаимодействия](https://www.rsdn.org/article/baseserv/ipc.xml)
Содержание ⬆️
- ### Ввод и вывод (I/O) [Ввод и вывод – Википедия](https://ru.wikipedia.org/wiki/%D0%92%D0%B2%D0%BE%D0%B4-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4) [Основные методы ввода-вывода (I/O) – tproger.ru](https://tproger.ru/translations/diversity-of-input-output-io/)
Содержание ⬆️
- ### Основы POSIX [POSIX – Википедия](https://ru.wikipedia.org/wiki/POSIX) [Что такое POSIX](http://citforum.ru/operating_systems/articles/posix.shtml)
Содержание ⬆️
## Основы Linux Операционные системы на базе ядра Linux это стандарт в мире серверной разработки, поскольку большинство серверов работают именно на таких ОС. Использовать Linux на серверах выгодно, ведь он рапространяется бесплатно. Существует огромное количество дистрибутивов (сборок с набором предустановленного ПО) Linux на любой вкус и цвет. Одним из самых популярных является Ubuntu. Именно с него можно начать своё погружение в серверную разработку. [Установить Ubuntu](https://ubuntu.com/download/desktop) можно на отдельный ПК или ноутбук. Если такой возможности нет, можно воспользоваться специальной программой [Virtual Box](https://www.virtualbox.org/wiki/Downloads), в которой можно [запускать другие ОС](https://lumpics.ru/how-install-ubuntu-on-virtualbox-virtual-machine/) поверх основной. Так же можно запустить [Docker](https://www.docker.com/products/docker-desktop) [контейнер с образом Ubuntu](https://losst.ru/zapusk-kontejnera-docker) (Docker - это отдельная тема, которая рассматривается в этом репозитории). После этого можно быстро пройти [вводный курс по Linux и Bash](https://younglinux.info/bash/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 <название_команды> # Краткое описание команды ### ПРАВА СУПЕРПОЛЬЗОВАТЕЛЯ sudo <команда> # выполняет команду с правами суперпользователя ``` [Основные linux-команды для новичка – habr.com](https://habr.com/ru/post/501442/) [44 команды Linux которые вы должны знать – losst.ru](https://losst.ru/42-komandy-linux-kotorye-vy-dolzhny-znat) [Ubuntu cheatsheet – GitHub](https://github.com/JREAM/ubuntu-cheatsheet/blob/master/README.md)
Содержание ⬆️
- ### Менеджер пакетов Встроенный менеджер пакетов APT позволяет устанавливать новые программы из сети с помощью терминала. ```bash ### ОСНОВНЫЕ КОМАНДЫ ДЛЯ РАБОТЫ С APT apt install <имя_пакета> # установить пакет apt remove <имя_пакета> # удалить пакет, но оставить конфигурацию apt purge <имя_пакета> # удалить пакет вместе с конфигурацией apt update # обновление информации о новых версиях пакетов apt upgrade # обновление пакетов, установленных в системе apt list --installed # список установленных в системе пакетов apt list --upgradable # список пакетов, которые требуют обновления apt search <имя> # поиск пакетов по имени в сети apt show <имя_пакета> # информация о пакете ``` [Как пользоваться apt – losst.ru](https://losst.ru/kak-polzovatsya-apt) [Использование APT. Команды apt и apt-get – pingvinus.ru](https://pingvinus.ru/note/apt)
Содержание ⬆️
- ### Скрипты Bash С помощью скриптов (сценариев) можно автоматизировать последовательный ввод любого количества команд. В Bash можно создавать различные условия (разветвления), циклы, таймеры и т.д. для выполнения всевозможных действий связанных с вводом в консоль. [Шпаргалка оп Bash – quickref.me](https://quickref.me/bash) [Шпаргалка оп Bash – learnxinyminutes.com](https://learnxinyminutes.com/docs/ru-ru/bash-ru/)
Содержание ⬆️
- ### Пользователи ```bash ### РАБОТА С ПОЛЬЗОВАТЕЛЯМИ useradd <имя> [ключи] # создать нового пользователя passwd <имя> # установить пароль пользователю usermod <имя> [ключи] # редактировать пользователя usermod -L <имя> # заблокировать пользователя usermod -U <имя> # разблокировать пользователя userdel <имя> [ключи] # удалить пользователя ### РАБОТА С ГРУППАМИ groupadd <группа> [ключи] # создать группу groupmod <группа> [опции] # редактировать группу groupdel <группа> [опции] # удалить группу usermod -a -G <группы(через запятую)> <пользователь> # добивить пользователя в группы gpasswd --delete <пользователь> <группы(через запятую)> # удалить пользователя из групп ``` ```js // СИСТЕМНЫЕ ФАЙЛЫ С ИНФОРМАЦИЕЙ О ПОЛЬЗОВАТЕЛЯХ "/etc/passwd"; // файл паролей, содержащий основную информацию о пользователях "/etc/shadow"; // файл теневых шифрованных паролей, содержащий зашифрованные пароли "/etc/group"; // файл групп, содержащий основную информацию о группах и принадлежащих этим группам пользователях "/etc/gshadow"; // файл теневых групп, содержащий шифрованные пароли групп ``` [Пользователи в Linux – добавление, изменение, удаление](https://host-consult.ru/polzovateli-v-linux/) [Группы и пользователи в Linux](https://sysadminium.ru/groups_and_users_in_linux/)
Содержание ⬆️
- ### Права доступа

chmod

Так как под одной ОС могут работать несколько разных пользователи, то соответственно у каждого такого пользователя будет своё личное файловое пространство. Отсюда вытекает, что у любого файла в Linux должны быть специальные атрибуты – права на доступ. Эти атрибуты должны сообщать, кто имеет право работать c тем или иным файлом. [Права доступа в Linux – younglinux.info](https://younglinux.info/bash/rwx) [Команда chmod – изменение прав доступа – younglinux.info](https://younglinux.info/bash/chmod)
Содержание ⬆️
- ### Работа с процессами ```bash ### ОСНОВНЫЕ КОМАНДЫ ДЛЯ РАБОТЫ С ПРОЦЕССАМИ ps # вывести 'снимок' процессов всех пользователей top # диспетчер задач в реальном времени <команда> & # запуск процесса в фоновом режиме, то есть не занимая консоль jobs # список запущенных в фоновом режиме процессов fg <номер> # вернуть процесс обратно в активный режим по его номеру bg <номер> # запуск остановленного процесса в фоновый режим kill # завершить процесс по id killall <программа> # завершить все процессы связанные с одной программой ``` [Работа с процессами в Linux – YouTube](https://www.youtube.com/watch?v=Y4W_rJStNSA)
Содержание ⬆️
- ### Работа с SSH Служба SSH позволяет получить удаленный доступ к терминалу другого компьютера. В случае с персональным компьютером, это может понадобиться для срочного решения какой-либо проблемы, а в случае с сервером это вообще очень распространенная практика. ```bash ### ОСНОВНЫЕ КОМАНДЫ 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 # копирования ключа на удаленную машину ``` [Как пользоваться SSH – losst.ru](https://losst.ru/kak-polzovatsya-ssh)
Содержание ⬆️
- ### Планировщик задач
Содержание ⬆️
- ### Системные логи
Содержание ⬆️
- ### Проблемы Linux
Содержание ⬆️
## Общие знания - ### Структуры данных - #### Хэш-таблицы - #### Очередь и стек - #### Связанные списки - #### Двусвязные списки - ### Форматы хранения данных - #### Текстовые JSON, YAML, XML - #### Бинарные Message Pack, BSON, ProtoBuf - ### Криптография - #### Хэши и хеш-функции - #### Цифровые подписи - #### Соль для подписей - #### Коллизия хэшей ## Язык программирования Выберите для изучения один из языков _(спсиок составлен по моему личному мнению)_: - [Go](https://github.com/avelino/awesome-go) - [JavaScript (Node.js)](https://github.com/sindresorhus/awesome-nodejs) - [Python](https://github.com/vinta/awesome-python) * ### Базовые знания - #### Примитивные типы данных - #### Функции - #### Набор, массив, хеш-таблица, кортеж - #### Объекты/классы/структуры, прототипы/интерфейсы/миксины - #### Ссылки, указатели - #### Область видимости переменных - #### Сборщик мусора - #### Преобразование типов - #### Слабая/сильная типизация в коде - #### Битовые операции - #### Обработка ошибок * ### Распараллеливание - #### Процессы - #### Потоки - #### КоРутины - #### Проблемы распараллеливания - #### Атомарные операции - #### Блокировки * ### Пакетный менеджер * ### Отладчик * ### Запуск HTTP-сервера * ### Кэширование * ### Шаблонизация * ### Ввод / Вывод (IO) ## Протокол HTTP - ### Формат протокола - ### Методы HTTP-запросов - ### Коды ответов - ### Заголовки - ### Cookie - ### CORS - ### CSP - ### Безопасность (HTTPS) - ### Различия HTTP 1.0 и HTTP 1.1 - ### HTTP 2 - ### HTTP 3 - ### Откладка сети в Chrome Dev Tools - ### Работа с HTTP через терминал - ### WebSockets - ### API форматы - ### Web сервера - #### NGNX - #### Apache httpd ## Базовое ПО - ### Система контроля версий Git - ### Контейнеризация и Docker - ### Postman / Insomnia ## Базы данных - ### Реляционные базы данных - ### Документоориентированные базы данных - ### Redis - ### Проблемы баз данных ## Дополнительные материалы и источники - [Backend Developer Roadmap: Learn to become a modern backend developer](https://roadmap.sh/backend) - [bzick/oh-my-backend: Backend Roadmap (from Junior to Senior)](https://github.com/bzick/oh-my-backend) - [zhashkevych/awesome-backend: 🚀 A curated and opinionated list of resources (English & Russian) for Backend developers](https://github.com/zhashkevych/awesome-backend) - [УЧЕБНЫЙ КУРС: Компьютерные сети](https://www.asozykin.ru/courses/networks_online)
Made with ♥
LICENSE 2022.