Oh My BackEnd
Что это? Этот документ содержит список (roadmap) навыков, которые часто требуются backend разработчику web-приложений. Документ разделён на этапы (темы). Каждый этап разделён на пункты. Каждый пункт, в документе, подразумевает что:
- бекендер знает что это и какую проблему решает.
- бекендер знает для чего и когда следует применить.
- бекендер знает как с этим работать или знает где подсмотреть.
- при разработке или проектировании бекендер помнит про них и учитывает в приложении.
Понимание принципа работы каждого пункта будет дополнительным бонусом в понимании всей темы, но это может занять много времени. Изучайте по желанию и необходимости.
Как работать с документом? Этапы и пункты выстроены в рекомендуемом порядке для изучения. Просто следуйте сверху-вниз.
Как работать с пунктами документа? Каждый пункт легко гуглится и имеет страницу в wikipedia.
Ссылки устанавливаются если есть альтернативная документация — более понятная и/или более подробная. Некоторые ссылки могут потребовать наличия VPN.
Ссылка на wikipedia ставятся для уточнения если название статьи неочевидно или можно перепутать статьи.
Цитатой обозначены пояснения к пункту для чего следует это знать и/или где с этим можно столкнуться.
Если пояснения нет — то либо не успели сделать, либо там и так ясно.
Есть ли разделение по скилам? Каждый пункт делится на градации junior, middle, middle+ (он же high middle).
Градации используются чтобы помочь выставить приоритеты в различных темах — на то что стоит изучать в первую очередь.
Тут применяется общепринятая градация навыков и зон ответственности, где senior это middle+ с soft-скилами.
В данном документе максимальным уровнем градации будет — middle+, так как этот документ акцентирует внимание на hard-скилах.
Метка guru ⚡ означает что этот пункт для более глубокого и продвинутого изучения темы (если у Вас есть время).
В каком состоянии документ? Документ еще находится в процессе дополнений и правок.
В идеале каждый пункт должен иметь градацию, иметь пояснение и ссылку на толковое разъяснение на русском языке.
До идеала еще далеко, но начало положено!
Если хотите что-то изменить (пункт, ссылку, опечатку) — создавайте issue или делайте pr.
Если хотите обсудить документ — создавайте обсуждение в discussions.
Содержание
Этап 1. Виртуализация docker
Для начала надо поднять виртуальную машину для экспериментов и исследований. В случае чего, виртуальную машину всегда можно пересоздать.
Есть много систем виртуализации, но docker выделяется среди них. Docker — популярный инструмент для десктопной виртуализации. На боевых серверах к нему прибегают в меньшей степени, так как там более популярен Kubernetes (aka k8s). Docker не единственная система виртуализации, ближайшие аналоги это Lima, Podman (нечто среднее между docker и k8s).
- установить docker junior
- запустить контейнер с Linux Ubuntu, последней LTS версией. Запустить bash (консоль) контейнера. junior
- установить удобное приложение для управления образами и контейнерами Kitematic, Portainer и т.д.
Либо сродниться с консольными командами docker. docker-desktop уже имеет свой dashboard для управления образами и контейнерами. junior
- docker compose для поднятия кластера контейнеров. middle
Для рабочего приложения, как правило, требуется несколько различных сервисов (база данных, кэшер, http-сервер и т.д.)
и всё это упаковать в один docker контейнер будет проблемно, просто из-за специфики работы самой виртуализации.
Тут как раз поможет compose чтобы запустить кучу контейнеров и подружить их между собой.
Этап 2. Linux
Изучить установленный в контейнере — Linux. Linux, де-факто, является серверной ОС для большинства web-приложений.
В этом разделе будет говориться о Linux, хотя (почти) всё так же актуально и для других posix-совместимых систем. Например для bsd семейства, включая MacOS. Однако, могут быть отличия.
В качестве стартового дистрибутива Linux, обычно, выбирают Ubuntu, но вы можете взять самый компактный - Alpine, который часто используется в виртуализации.
- Установка пакетов и обновление системы через
apt/apt-get в Ubuntu/Debian и apk в Alpine. junior
В процессе исследований и различных проб придётся много раз ставить, обновлять и переустанавливать множество пакетов Linux.
Лучше сразу изучить как работают эти команды. Нужны базовые операции: найти, установить, обновить, удалить.
- Базовые навыки в
bash (улучшенный sh aka shell). junior
В Linux-подобных системах bash’ем пронизано всё. Вы гарантировано столкнётесь с ним и будут случаи когда надо будет писать bash/shell скрипты.
- Базовый синтаксис bash. middle
По факту это единственный скриптовый язык который гарантированно будет установлен в системе.
- Управляющие операторы
if, for и while
- Логические операторы
;, &&, ||
- Исполняющие выражения
`cmd` и $(cmd)
- Базовые команды для работы с файловой системой
cd, ls, find, cat, cp, mv, mkdir, rmdir, rm. junior
- Вызов мануалов через команду
man. junior
Через эту команду можно получить справку по любой команде, операции, файлам и даже исходному коду.
- Конвейеры команд через оператор
| (cmd1 | cmd2 | cmd3). junior
Linux имеет большое количество команд для обработки данных и для решения различных задач которые вам может понадобится объединять через конвейеры.
- Команды обработки данных
cat, tail, head, grep, awk, sed. middle
Этот набор потребуется для сканирования и анализа логов или больших объёмов текстовых данных.
- Команды работы с архивами данных
zcat, gzip, gunzip, tar, zgrep. middle
Как правило, никто не хранит логи или большие объёмы текстовых данных “как есть”, обычно это архив gz или tar.gz (tgz).
- Консольные редакторы vim, nano. Открыть файл, внести изменения, сохранить. junior
Редактирование файла из консоли не такая редкость. Кстати, чтобы выйти из vim: esc, напечатайте :q!, enter.
- Консольные просмотрщики
less, zless. Открыть, найти слово, закрыть. junior
Редакторы избыточны, чтобы просто посмотреть содержимое файла. Просмотрщики так же справляются с не “стандартными” для редакторов файлами.
- Консольный файловый менеджер
mc. junior
Консольные файловые менеджеры, наподобие Midnight Commander, предоставляют UI, который делает более удобной и наглядной работу с типовыми файловыми операциями.
- Фоновые задачи, оператор
&, команды jobs, fg, bg. middle
Оператор позволит в одной shell-сессии запускать несколько команд.
- Команда игнорирования сигналов прерываний
nohup. middle
Команда позволит, при завершении shell-сессии, оставлять в живых запущенные фоновые задачи до их логического завершения.
- Потоки, перенаправление потоков, операторы
>, >>, <. junior
Куда писать вывод, а куда ошибки, помогут указать эти операции.
- Упороться полностью консолью guru ⚡
- Понятие
процесс. junior
Как и во всех других ОС, в Linux запущенные приложения представляются процессами.
- Команды анализа процессов
top, htop, ps (ps aux). junior
Этакий “диспетчер задач” в мире Linux, позволяющий мониторить процессы системы.
- Родительский процесс, дочерний процесс. middle
Процессы не появляются из ниоткуда, их что-то запускает. Понимание иерархии процессов облегчит работу с ними и сделает проще понимание мультипроцессовых приложений.
- Мастер-воркер процессы, демон (daemon). middle
Это один из распространённых видов распараллеливания вычислений в приложениях. Много программ используют именно такой подход распараллеливания.
- Зомби-процессы. Откуда берутся и как с ними бороться. middle+
Это вид проблемы распараллеливания вычислений через дочерние процессы. Возникает когда у мастер-процесса есть проблемы или баги.
- Отправка сигналов процессам. junior
Это основной рычаг воздействия на процессы сторонними приложениями (системными или вашими).
- Системный вызов (syscall). middle+
Системный вызов (вызов API ядра Linux) — не бесплатная операция и лучше их держать под контролем на высоконагруженных приложениях.
- Команда анализа системных вызов процесса через
strace. middle+
Самый простой и доступный способ посмотреть какие системные вызовы делает процесс в реальном времени.
- Изучение понятия
дескриптор. middle
Любой поток данных (входящий и/или исходящий) представляется в виде дескрипторов. Что-либо читать или писать будете (вероятней всего) через дескриптор.
- Стандартные дескрипторы
STDIN, STDOUT, STDERR и их нумерация. middle
Любой поток в процессе пронумерован и есть “зарезервированные” номера под определенные потоки.
- Потоки, сокеты и unix-сокеты. middle
Это всё разновидности дескрипторов с которыми придётся работать. На всех них распространяются правила дескрипторов, ну так как они и есть дескрипторы.
- Ограничение на дескрипторы. middle+
Не редкая проблема приложений когда оно упирается в лимит открытых дескрипторов.
- Команда анализа открытых дескрипторов у процесса через
lsof. middle+
Для отладки приложения всегда надо знать с чем ведёт общение приложение (отлично работает в паре с strace, сопоставляя номера дескрипторов).
- Пользователи junior
- Пользователь
root. junior
По сути это админ системы. Избегайте использование root (даже в контейнерах) так как доступ к root даёт доступ ко всей системе, о чем мечтают все зловреды.
- Супер пользователь, команды su и sudo. junior
Никто не даст вам root на проде, но вполне можете иметь “привилегированного” пользователя, который умеет в sudo.
- Файловая система junior
- Команда
stat junior
- Права и доступы файловой системы junior
Избыточные доступы ведут к дыре в безопасности, недостаток доступов ведёт к багам в приложении. Осмысленно ставьте где x (особенно у директорий), где r, а где w.
- Понимание описания доступов вида
--xr-xrwx и 0137 (восьмеричная) у файлов и директорий. junior
Обычно в таком виде вы будете видеть уровни доступов в консолях.
- Исполняемые файлы, sha bang. junior
- Изменение прав доступов через команды
chmod, chown. middle
- Работа с дисками middle+
Нужно знать где, как и куда примонтированы различные диски или носители. Бывает, что приложение может работать сразу с несколькими дисками, некоторые могут быть сетевыми.
- Ссылки на файловой системе. junior
- Symlink (aka символическая ссылка). junior
Самый распространённый вид ссылки. Повсеместно используется в Linux да и пакетных менеджерах разных языков. Вы тоже будете это использовать.
- Hardlink (aka жесткая ссылка). middle
Редкий случай использования ссылки. Потребуется если надо “дедуплицировать” большой объём файлов.
По сути позволяет создать несколько имён одному файлу.
- Запуск и остановка сервисов systemd. middle
Linux по сути просто пачка запущенных приложений как сервисов.
- SSH. junior
Самый доступный способ запустить shell на удалённой машине это использовать SSH. Используется повсеместно.
- Генерация собственного ssh-rsa ключа через
ssh-keygen. junior
Без него вы не попадёте на хосты по SSH.
- Использование публичного ssh-rsa ключа для входа на удалённую машину (используйте второй контейнер с Linux). junior
- Перенос контента. junior
Появляется потребность перекинуть логи, дамп базы и другие файлы между машинами или к себе.
scp junior
самый простой инструмент переноса файлов между хостами по ssh.
rsync middle
пожалуй самый мощный инструмент переноса файлов между хостами с кучами настроек, правил и протоколов.
rclone middle
“rsync” для облачных хранилищ. Универсальный инструмент для работы с контентом, который хранится в облаках или где-то по сети.
- Планировщики задач
- Команда
crontab и запуск crond.
Самый распространённый и простой планировщик задач, с весьма гибкими настройками расписания
- Команда
at middle
Когда хотите запустить задачу разово, к определенному времени.
В crontab это потребует отдельно создавать расписание, что сильно затрудняет автоматику и захламляет всё расписание.
- Оперативная память. middle
- Команда
free, мета информация /proc/meminfo. middle
Всегда оценивайте сколько памяти потребуется приложению или скриптам, чтобы не быть убитыми системой.
- Ошибка
Out Of Memory (OOM) и причина появления. OOM-киллер. middle+
Именно это происходит когда вы превысили все допустимые пределы потребления памяти в системе.
- Логи системы. Для чего и как посмотреть. middle
Когда случаются проблемы то логи — единственное, что может навести на суть проблемы.
Помимо логов приложения стоит заглядывать в логи системы, иногда её проблема может вести к проблеме в приложениях. Стоит выделить некоторые логи:
dmesg (driver messages) — важные сообщения от компонентов Linux, включая от OOM-киллера. middle
syslog — системный журнал. middle
Там могут быть сообщения от ядра Linux, различных служб, сетевых интерфейсов и многого другого.
- Проблемы в Linux и последствия. junior
Их много, но выделим только несколько.
- Kernel panic. junior
BSoD аналог для Linux. Самая не приятная ошибка системы, явно намекающая, что система не стабильна.
- Segmentation fault (aka segfault aka сегфолт). middle
Не такая уж и редкая ошибка приложений, как хотелось бы. Приложение попыталось работать с памятью доступа к которой у неё нет.
- Core dump (aka корка). middle+
Результат обработки segmentation fault системой. Корка может потребоваться разработчику упавшего приложения для анализа состояния программы на момент падения.
Этап 3. Общие знания
Некоторые пункты сложно категоризировать в этом документе. Но без них не обойтись.
Это базовые вещи которые используются повсеместно в коде, в системах, “под капотом” вашего языка программирования.
- Регулярные выражения. Поиграться регулярными выражениями можно тут. Хоть каждый язык может иметь своё видение регулярных выражений, в общем смысле (и синтаксисе) они похожи. middle
Рано или поздно придётся спарсить данные из текста или проверять данные, вот тут как раз и потребуются регулярные выражения.
- Криптография. junior
Не пугайтесь. Пункт подразумевает прикладное применение криптографических функций (для чего нужны те или иные функции), а не изучении самой криптографии.
- Хеши и хеш-функции, в том числе
crc32, md5, sha1, sha256. junior
- Цифровые подписи. junior
Чтобы обезопасить от подделки данных используются цифровые подписи этих же данных.
- Соль для подписей. middle
В теории (да и на практике) хеш-функцию можно определить и чтобы сильнее обезопасить от “взлома” вашего хеша, используя так называемую соль.
- Коллизии хешей. middle
Хеш-функции могут на разных данных вернуть один и тот же результат (хеш), что может привести к проблемам и багам.
Лучше знать какова вероятность коллизий у хеш-функции и как их избегать.
- Симметричное и асимметричное шифрование. middle+
Иногда приходится шифровать данные и важно выбрать стратегию шифрования.
- Принцип работы TLS. middle+
Имеется ввиду как работаю CA корневые и промежуточные, что стоит за сертификатом.
- Базовая работа с
git. junior
По факту это дефолтная система контроля версий в мире IT.
- Коммит изменений (commit) junior
- Отправка изменений (push/pull) junior
- Создание веток и тегов (branch/tag) junior
- Слияние веток (merge) junior
- Упороться полностью git’ом guru ⚡
- Структуры данных. junior
- Хеш таблицы. middle
Таблицы часто используются в самих языках программирования (ассоциативные массивы, объекты и т.п.)
- Очередь и стек. junior
Самые простые структуры данных, которые часто придётся использовать повседневно в коде.
- Связный список и двусвязный список. middle
Эти структуры данных часто используются в разработке так как являются самым простым способом связать элементы с собой.
Они так же активно используются внутри вашего языка (под “капотом”) повсеместно.
- Форматы хранения и передачи данных
- Текстовые. junior
Текстовые форматы используются так же для хранения конфигурации приложений
- Бинарные. middle
Бинарные форматы используются сугубо для хранения и передачи данных.
- MessagePack
- BSON (бинарный аналог JSON)
- ProtoBuf
Этап 4. Сеть
Сеть в разработке самая важная и, часто, мало заметная часть.
- Базовое понимание работы сети. junior
- Протокол TCP middle
Вы вряд ли будете читать пакеты TCP. Но полезно знать КАК работает TCP,
это позволит понять почему при идеальных “интернетах” всё равно приложение может лагать по сети.
- TCP пакет guru ⚡
Вряд ли придётся работать с пакетом TCP напрямую, однако из его структуры можно подчерпнуть некоторую полезную информацию по протоколу TCP в целом.
- Флаги ACK, SYN, FIN и прочие middle+
Флаги отвечают за организацию, подтверждение передачи и закрытие TCP коннектов.
- Буферы (window size) middle
- Проблемы TCP middle+
TCP очень старый протокол, который уже не удовлетворяет современным реалиям.
- Протокол UDP. middle
Самый простой сетевой протокол семейства. Требуется понимание его работы.
HTTP/3.0, DNS работает на протоколе UDP, и понимание UDP даст немного понимания в работе HTTP/3.0
- UDP-пакет guru ⚡
Изучить придётся только если потребуется создать свой протокол передачи данных взамен изжившего себя TCP.
- Проблемы сети. junior
Их, как всегда, много. Но стоит выделить те, которые явно влияют на скорость работы сети.
По большей части эти проблемы присущи TCP, но могут появиться и там где эмулируют TCP — на другом протоколе (например UDP)
- Packet loss junior
- Reordering middle
- Jitter middle
- Round-Trip Time (RTT aka лаг) junior
- Сетевое ожидание (Network latency, задержка) middle
- IPv4, IPv6.
Базовое отличие протоколов надо знать, хотя бы, чтобы правильно создать колонку IP в базе и обработку в коде.
- DNS. junior
Ваш код 24/7 будет работать с доменами так как никто не использует чистый IP для соединения с чем-либо.
Зная как работает DNS и управление резолвингом домена в системе, можно упростить отладку в некоторых случаях.
- Как работает резолвинг доменов junior
- DNS записи middle
- Основные MX, CNAME, NS, A, AAAA, TXT middle
- Прочие записи middle+
- Файл
/etc/hosts junior
Самый простой и доступный способ поменять IP любому домену, локально, конечно же.
- Файл
/etc/resolv.conf middle+
Конфигурация для системы, как и где надо резолвить домены.
- Консольные команды работы с доменами:
whois, dig, host. junior
Чтобы идентифицировать проблему с доменом нужно научиться работать с этими командами.
Анализируйте домены как через дефолтный для себя DNS так и через публичные, такие как 1.1.1.1 или 8.8.8.8.
- Трассировки маршрутов. middle
- Анализ трафика через
tcpdump + wireshark guru ⚡
Не простой, но очень эффективный способ “увидеть” и проанализировать трафик в удобном UI.
- Упороться сетью полностью 🇺🇸 guru ⚡
Этап 5. Базы данных
Без баз данных — никуда. Самый частый вид баз данных — реляционные базы данных.
Поэтому даже junior должен уметь работать с ними,
а вот с NoSQL базами данных можно ознакомиться чуть позже.
- Реляционные базы данных MySQL/Postgres/и т.д. junior
MySQL подразумевает как MySQL от Oracle, так и различные варианты в виде MariaDB, Percona XTraDB и т.д.
В общем понимании семейства: MySQL/Postgres/MSSQL/и т.д. имеют схожие SQL API, различаются только внутренней реализацией, производительностью и масштабируемостью.
- Базовый синтаксис запросов
SELECT/INSERT/UPDATE/DELETE. junior
- Создание и модификация таблиц junior
- Типы колонок таблиц их назначение и различие junior
- Целочисленные типы (int)
- Текстовые типы (text)
- Наборы, перечисления (enum)
- Строковые типы (char, varchar)
- Десятичные типы (decimal)
- Числа с плавающей запятой (double)
- прочие
- Создание и применение ALTER запросов. junior
- Анализ выполнения запросов через
EXPLAIN, понимание результатов EXPLAIN. junior
Самый действенный способ понять почему тормозит запрос.
- Диагностика производительности.
Всегда будут появляться медленные запросы, и чем их больше, тем медленнее будет работать ваше приложение.
И как правило у разных баз данных всегда есть аналитика для поиска “узких” мест.
- Ведение логов медленных запросов — slow_log. middle
Не получится сидеть всё время, мониторя все запросы. Проще настроить агрегацию медленных запросов.
- Чтение аналитики и статистики middle+
В MySQL семействе это perfomance_scheme, в postgres это Statistics Collector.
Поможет в полной мере понять какие запросы плохо работают, где не достаёт индексов, где их в избытке и так далее.
- Индексы junior
Индексы очень важная часть баз данных. Ваши запросы всегда должны работать “по индексам”.
Запрос без индекса или с “плохим” индексом, на нагруженных проектах, гарантировано может привести к падению приложения.
- Кластерный индекс middle
Это не относится к вычислительным кластерам. Это индекс данных, по нему и укладываются строки в таблице.
- PRIMARY индекс (aka первичный индекс) junior
Индекс, уникально идентифицирующий каждую строчку в таблице. Как правило, PRIMARY индекс и есть кластерный индекс.
- UNIQUE/обычные индексы junior
- Составные индексы. junior
Условия и/или сортировки редко когда бывают по одному полю, обычно их больше. Вот тут на сцену выходят составные индексы.
Тут надо понимать что в составном индексе, последовательность полей важна.
- Понимание какие поля в какой последовательности добавлять в индекс при фильтрации и/или сортировке. middle
- Понимание как строятся деревья индексов у составных индексов. middle+
- Понимание работы индексов middle
- Алгоритм построения индексов
BTREE. guru ⚡
Это понимание не сделает ваши запросы быстрее, но даст понятие как ведут себя те или иные данные в индексах.
- Объединение таблиц
LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTER JOIN, JOIN. junior
Данные всегда “размазаны” по таблицам. Чтобы их собрать потребуются эти операторы.
- Группировка данных через
GROUP BY. junior
Группировка данных — не редкие запросы, как правило, используются для сбора статистики.
- Фильтрация после группировки. junior
- Функции работы с группами MAX/MIN/AVG/и т.д. junior
- Понимание и назначение внешних ключей (
foreign key) middle
Нередко используют внешние ключи для поддержания консистентности данных в базе.
- Транзакции. middle
Чтобы провести несколько операций атомарно (как одну операцию) используются транзакции.
- Уровни изоляций транзакций. middle
- Deadlock и как его не допускать. middle+
- Триггеры на
INSERT/UPDATE/DELETE. middle
Не стоит активно использовать триггеры.
Тем не менее они могут оказаться полезными в некоторых отладочных или maintenance случаях.
- Хранение деревьев. junior
Не просто сохранить древовидную структуру в реляционной базе. Есть насколько алгоритмов со своими плюсами и минусами.
На самом деле актуально и для других видов баз данных
- Алгоритм parent-child junior
Классический вариант “с parent_id” у дочерних элементов. Простые и “дешевые” на вставку элементов в деревья.
Но такие деревья затратные “на сборку”.
- Алгоритм nested sets middle
Алгоритм позволяет достаточно дёшево собирать деревья с различными модификациями и сегментами.
Но затратные на вставку элементов в деревья.
- Документо-ориентированная база данных (часть NoSQL баз данных) — MongoDB. middle
Среди всех NoSQL самой популярной является MongoDB.
- Типы данных в коллекциях, их назначение и различия. middle
- Анализ выполнения запросов через
explain(), понимание его результатов. middle
- Понимание работы индексов (аналогично SQL индексам с небольшими отличиями). middle
- Sparse свойство индекса
- Partial свойство индекса
- TTL свойство индекса
- Geospatial индекс
- Text индекс
- Вложенные объекты, массивы. middle
- Агрегации middle+
- Работа с репликацией. middle+
- Работа с кластером MongoDb. middle+
- Redis junior
Универсальный инструмент хранения данных с уклоном в производительность.
Может быть, как быстрым постоянным хранилищем, так и реактивным кэширующим, временным хранилищем.
- Проблемы в базах данных junior
- Deadlock middle
- Переполнение числовых полей (в том числе autoincrement) junior
- Full scan middle
- Split-brain middle+
Этап 6. Протокол HTTP
Каждый WEB разработчик должен понимать протокол HTTP.
Разработчик который не знает HTTP протокол — это как сапожник без сапог.
Поэтому даже junior должен многое знать про протокол HTTP.
- Понимание общего формата протокола: где заголовки, а где тело. junior
- Сродниться со вкладкой Сеть/Network в инспекторе браузера junior
В консоли можно наблюдать все HTTP-запросы со страницы и даже делать самим через функцию fetch.
- Методы HTTP-запросов. Их назначение и ограничения. junior
Каждый метод имеет своё назначение (достаточно перевести названия методов) и, как следствие, имеет свои условности и ограничения.
- Основные GET, POST, HEAD junior
- Дополнительные
PUT, DELETE, PATCH middle
Используются в REST API вместе с основными методами
- Прочие middle+
Это уже методы узкой направленности, редко когда придётся с ними напрямую работать. Тем не менее они активно используются приложениями.
- Коды HTTP ответов junior
- Принцип разделения кодов на группы: 100-199, 200-299, 300-399, 400-499, 500-599. junior
Коды создавались и описывались не в хаотичном порядке. Есть чёткое разделение их “сфер влияния”.
Даже если какой-то сервер придумает свой код ответа, то по группе вы сможете лучше понять причину такого ответа.
- Основные (частые): 200,
206,
301,
302,
304,
400,
401,
403,
404,
500,
502,
503,
504 junior
Это наиболее частые коды ответов которые вы гарантировано встретите.
- Другие middle
- Заголовки HTTP junior
- Куки junior
На данный момент это единственный точный способ идентифицировать пользователя.
- Cross-Origin Resource Sharing (CORS) middle
Для кросс-доменных XHR/WebSocket запросов надо научиться работать с CORS, иначе запросы не будут работать.
- Content-Security-Policy (CSP) middle
Для повышения безопасности можно ограничить и указать что и откуда может загружаться и запускаться на странице.
- Различия версий протокола HTTP: HTTP/1.0, HTTP/1.1 middle
Не смотря на появление новых версий протокола HTTP, версии HTTP/1.0 и HTTP/1.1 всё еще остаются частыми во внутренних сетях кластеров.
- Консольные команды HTTP запросов
curl, wget junior
На серверах (хостах) нет браузеров, чью удобную консоль можно использовать.
Там есть shell и множество утилит, которые умеют работать с HTTP.
- Различия протоколов HTTP/1.1, HTTP/2.0 и HTTP/3.0 middle+
Каждый протокол имеет свои возможности и улучшения, которые можно использовать для ускорения приложения.
- WebSocket протокол middle
Это расширения версии HTTP/1.1 и выше для механизма обмена данными по одному соединению.
Часто используется для чатов и/или для event-driven модели.
- WebRTC guru ⚡
Если надо будет организовывать P2P (peer-to-peer) чаты или P2P стриминг, то WebRTC как раз для этого.
- HTTP API форматы junior
- Web сервера junior
- Nginx. junior
Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - высока.
- Apache httpd. junior
Один из старых, но активно использующихся Web-серверов широкого профиля.
Хоть он уже и уступает nginx-у в популярности, но столкнуться с ним в проекта есть всё так же легко.
Этап 7. Безопасность
Ваше приложение всегда под угрозой, даже если это какое-то home-page приложение.
Ботнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).
- Виды управления доступом middle
- Аутентификация junior
- Basic junior
Самый простой вид авторизации, не требующий дополнительных вычислительных мощностей (серверов).
- SSO (Single Sign On) junior
Общее название подхода к авторизации: авторизация на множестве приложений через одну точку. OAuth и OpenID — частные случаи SSO.
- OAuth2 middle
Распространенный вид авторизации через посредника, который гарантирует что Вы это Вы и может выдать некоторые данные по пользователю, с его согласия.
Часто сталкиваются c OAuth2 тогда когда надо подключить авторизацию через соц. сети. У них у всех OAuth2 (но каждый со своими модификациями).
- OpenID middle
Один из первых популярных SSO. Уступает Oauth2 по популярности, но так же где-то используется.
- Ldap middle
Данный вид авторизации используется, чаще всего, для авторизации во внутренних сервисах своих сотрудников.
- JSON Web Token (JWT) middle
Это не тип авторизации, а инструмент для передачи идентифицирующих данных. Однако такой токен может иметь очень широкое применение, не только в авторизации.
- Виды атак и уязвимостей junior
- Фишинг сайта junior
- Небезопасное перенаправление, Open Redirect junior
- Инъекции (например SQL-инъекции) junior
- XSS атака junior
- IDOR уязвимость middle
- CRLF атака junior
- LFI/RFI атака junior
- DoS/DDoS middle
- HTTP-флуд middle
- SYN flood (потребуются знания TCP) middle+
- UDP flood (UDP амплификация) middle+
- Медленный запрос middle
- Бомбы middle
- Logic Bomb middle
- Zip Bomb junior
- Атака посредника (Man In The Middle, MITM) middle
- Брутфорс (например брутфорс паролей) junior
- Спуфинг middle
Этап 8. Тут должен быть ваш язык программирования
Языков программирования много. Однако, они имеют много общего между собой, кто-то больше, а кто-то меньше.
Этот этап будет задевать только часто встречающиеся пункты в большинстве популярных языков программирования.
Этап не будет чётко дробиться на градации, так как многое зависит от самого языка, его возможностей и его расширений.
Принцип работы с этим разделом: ищите %ваш_язык_программирования% %пункт_из_этапа%.
Учтите, что некоторых пунктов может не быть в вашем языке.
- Что такое интерпретатор, компилятор, JIT, оп-код, байт-код. Что из этого использует ваш язык? junior
- Ваш язык программирования junior
- Примитивные типы данных
Базовые скалярные типы — целые числа, строки, булевы значения, числа с плавающей точкой, null/nil и так далее.
- Функции, макросы.
- Определение и их вызов
Умение определить простую функцию и вызвать её. Бывают языки где функций без объектов не может быть
- Главная функция или точка входа в программу.
В языке программа может запускаться только через стартовую функцию, например main().
Но некоторые языки позволяют запустить файл с кодом.
- Набор, массив, хеш-таблица (ассоциативный массив), кортеж.
Представляет собой различные комбинации примитивных типов. Например числовой массив данных можно сделать почти в любом языке.
- Объекты/классы/структуры, прототипы/интерфейсы/миксины.
Все современные языки имеют объекты и умеют ими оперировать.
- Перегрузка операторов
Позволяет объектам самим определять как над ними производить математические, логические и прочие действия (операции).
- Перегрузка методов
Позволяет определить несколько методов с одним названием, но с разной сигнатурой.
Как правило это достигается за счет различного набора параметров (количества или типов принимаемых значений) для каждого метода.
- Generics (aka генерики aka шаблоны aka обобщения)
Специфичная возможность некоторых языков программирования со строгой типизацией.
Позволяет определить единую сигнатуру для обработки различных типов.
- Объектно-ориентированное программирование (ООП)
- Ссылки, слабые ссылки.
- Области видимости переменной.
Важно понимать когда ваши переменные доступны в коде, а где уже/ещё нет. Особенно важно это понимать когда работаете с ссылками.
- Garbage Collector (GC).
Много языков высокого (и не только) уровня имеют GC. GC отвечает за освобождение памяти от мусора (забытые данные, данные которые уже не нужны коду)
в процессе работы кода. Это очень важная часть вашего языка, так как пока работает GC
README 内容过长,已截取前 64 KB。完整内容请前往 GitHub 仓库查看。
评论