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
- Этап 2. Linux
- Этап 3. Общие знания
- Этап 4. Сеть
- Этап 5. Базы данных
- Этап 6. Протокол HTTP
- Этап 7. Безопасность
- Этап 8. Тут должен быть ваш язык программирования
- Этап 9. Электронная почта
- Этап 10. Полнотекстовый поиск
- Этап 11. Логи и метрики
- Этап 12. Проектирование и разработка
Этап 1. Виртуализация docker
Для начала надо поднять виртуальную машину для экспериментов и исследований. В случае чего, виртуальную машину всегда можно пересоздать.
Есть много систем виртуализации, но docker выделяется среди них. Docker — популярный инструмент для десктопной виртуализации. На боевых серверах к нему прибегают в меньшей степени, так как там более популярен Kubernetes (aka k8s). Docker не единственная система виртуализации, ближайшие аналоги это Lima, Podman (нечто среднее между docker
и k8s
).
- установить docker junior
- запустить контейнер с Linux Ubuntu, последней LTS версией. Запустить bash (консоль) контейнера. junior
- установить удобное приложение для управления образами и контейнерами Kitematic, Portainer и т.д. Либо сродниться с консольными командами docker. На некоторых OC десктопный docker уже имеет свой 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
akashell
). 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
). juniorLinux имеет большое количество команд для обработки данных и для решения различных задач которые вам может понадобится объединять через конвейеры.
- Команды обработки данных
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
⚡
- Базовый синтаксис bash. middle
- Понятие
процесс
. 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
Редкий случай использования ссылки. Потребуется если надо "дедуплицировать" большой объём файлов. По сути позволяет создать несколько имён одному файлу.
- Symlink (aka символическая ссылка). junior
- Запуск и остановка сервисов systemd. middle
Linux по сути просто пачка запущенных приложений как сервисов.
- SSH. junior
Самый доступный способ запустить
shell
на удалённой машине это использовать SSH. Используется повсеместно.- Генерация собственного ssh-rsa ключа через
ssh-keygen
. juniorБез него вы не попадёте на хосты по SSH.
- Использование публичного ssh-rsa ключа для входа на удалённую машину (используйте второй контейнер с Linux). junior
- Генерация собственного ssh-rsa ключа через
- Перенос контента. 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-киллера. middlesyslog
— системный журнал. middleТам могут быть сообщения от ядра Linux, различных служб, сетевых интерфейсов и многого другого.
- Проблемы в Linux и последствия. junior
Их много, но выделим только несколько.
- Kernel panic. junior
BSoD аналог для Linux. Самая не приятная ошибка системы, явно намекающая, что система не стабильна.
- Segmentation fault (aka segfault aka сегфолт). middle
Не такая уж и редкая ошибка приложений, как хотелось бы. Приложение попыталось работать с памятью доступа к которой у неё нет.
- Core dump (aka корка). middle+
Результат обработки segmentation fault системой. Корка может потребоваться разработчику упавшего приложения для анализа состояния программы на момент падения.
- Kernel panic. junior
Этап 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
Эти структуры данных часто используются в разработке так как являются самым простым способом связать элементы с собой. Они так же активно используются внутри вашего языка (под "капотом") повсеместно.
- Хеш таблицы. middle
- Форматы хранения и передачи данных
- Текстовые. junior
Текстовые форматы используются так же для хранения конфигурации приложений
- JSON
- YAML
- XML
- Бинарные. middle
Бинарные форматы используются сугубо для хранения и передачи данных.
- MessagePack
- BSON (бинарный аналог JSON)
- ProtoBuf
- Текстовые. junior
Этап 4. Сеть
Сеть в разработке самая важная и, часто, мало заметная часть.
- Базовое понимание работы сети. junior
- Протокол TCP middle
Вы вряд ли будете читать пакеты TCP. Но полезно знать КАК работает TCP, это позволит понять почему при идеальных "интернетах" всё равно приложение может лагать по сети.
- TCP пакет guru
⚡ Вряд ли придётся работать с пакетом TCP напрямую, однако из его структуры можно подчерпнуть некоторую полезную информацию по протоколу TCP в целом.
- Флаги ACK, SYN, FIN и прочие middle+
Флаги отвечают за организацию, подтверждение передачи и закрытие TCP коннектов.
- Буферы (window size) middle
- Проблемы TCP middle+
TCP очень старый протокол, который уже не удовлетворяет современным реалиям.
- TCP пакет guru
- Протокол UDP. middle
Самый простой сетевой протокол семейства. Требуется понимание его работы. HTTP/3.0, DNS работает на протоколе UDP, и понимание UDP даст немного понимания в работе HTTP/3.0
- UDP-пакет guru
⚡ Изучить придётся только если потребуется создать свой протокол передачи данных взамен изжившего себя TCP.
- UDP-пакет guru
- Протокол TCP middle
- Проблемы сети. 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
- Типы колонок таблиц их назначение и различие junior
- Анализ выполнения запросов через
EXPLAIN
, понимание результатовEXPLAIN
. juniorСамый действенный способ понять почему тормозит запрос.
- Диагностика производительности.
Всегда будут появляться медленные запросы, и чем их больше, тем медленнее будет работать ваше приложение. И как правило у разных баз данных всегда есть аналитика для поиска "узких" мест.
- Ведение логов медленных запросов — slow_log. middle
Не получится сидеть всё время, мониторя все запросы. Проще настроить агрегацию медленных запросов.
- Чтение аналитики и статистики middle+
В MySQL семействе это perfomance_scheme, в postgres это Statistics Collector. Поможет в полной мере понять какие запросы плохо работают, где не достаёт индексов, где их в избытке и так далее.
- Ведение логов медленных запросов — slow_log. middle
- Индексы 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
Алгоритм позволяет достаточно дёшево собирать деревья с различными модификациями и сегментами. Но затратные на вставку элементов в деревья.
- Алгоритм parent-child junior
- Кластерный индекс middle
- Базовый синтаксис запросов
- Документо-ориентированная база данных (часть NoSQL баз данных) — MongoDB. middle
Среди всех NoSQL самой популярной является MongoDB.
- Типы данных в коллекциях, их назначение и различия. middle
- Анализ выполнения запросов через
explain()
, понимание его результатов. middle - Понимание работы индексов (аналогично SQL индексам с небольшими отличиями). middle
- Sparse свойство индекса
- Partial свойство индекса
- TTL свойство индекса
- Geospatial индекс
- Text индекс
- Вложенные объекты, массивы. middle
- Агрегации middle+
- Работа с репликацией. middle+
- Работа с кластером MongoDb. middle+
- Redis junior
Универсальный инструмент хранения данных с уклоном в производительность. Может быть, как быстрым постоянным хранилищем, так и реактивным кэширующим, временным хранилищем.
- базовая работа с ключами
🇺🇸 junior - работа со списками
🇺🇸 junior - работа с хешами
🇺🇸 junior - работа с набором
🇺🇸 junior - сортированным набором
🇺🇸 middle - Транзакции
🇺🇸 , но в другом, своём, понимании. - Работа с Lua
🇺🇸 middleДаёт возможность запустить любой набор команд атомарно, дополнительно снабдив логикой.
- базовая работа с ключами
- Проблемы в базах данных 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
Каждый метод имеет своё назначение (достаточно перевести названия методов) и, как следствие, имеет свои условности и ограничения.
- Коды 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
- Принцип разделения кодов на группы: 100-199, 200-299, 300-399, 400-499, 500-599. junior
- Заголовки HTTP junior
- MIME тип (тип документа) и заголовок типа Content-Type. junior
- Формат передачи
application/x-www-form-urlencoded
junior - Формат передачи multipart/form-data middle
- Формат передачи
- Системные заголовки Host, Content-Length, Content-Encoding, Transfer-Encoding) junior
- Кэширование HTTP, заголовки управления кэшем:
Cache-Control
,Expires
,Vary
,ETag
,Last-Modified
.
- MIME тип (тип документа) и заголовок типа Content-Type. 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-приложения - высока.
- Ознакомление с базовыми возможностями junior
- Масштабируемая конфигурация nginx middle
- Написание простых локаций в
/etc/nginx/nginx.conf
раздачи файлов junior - HTTP, FastCGI проксирование junior
- Apache httpd. junior
Один из старых, но активно использующихся Web-серверов широкого профиля. Хоть он уже и уступает nginx-у в популярности, но столкнуться с ним в проекта есть всё так же легко.
- Nginx. junior
Этап 7. Безопасность
Ваше приложение всегда под угрозой, даже если это какое-то home-page приложение. Ботнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).
- Виды управления доступом middle
- Access Control List (ACL) middle
- Role-based access control (RBAC) middle
- Attribute-based access control (ABAC) 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
Это не тип авторизации, а инструмент для передачи идентифицирующих данных. Однако такой токен может иметь очень широкое применение, не только в авторизации.
- Basic junior
- Виды атак и уязвимостей 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 — не работает ваш код. А если GC будет часто и/или много работать то ваше приложение начнет лагать и "зависать".
- Когда и как запускается GC.
- Изучить настройки GC.
- Включение/выключение GC, принудительный запуск GC.
- Профилирование утечек или потребления памяти.
- Преобразование типов.
- Слабая/сильная типизация в коде. На что влияет и как с этим жить.
Сильная типизация требует явного указания в коде типа данных, которые будут использоваться в переменной, аргументе и т.д. А динамическая, наоборот, позволяет не указывать тип. Вычисление типа значения будет происходить динамически, в момент выполнения программы/программного кода (runtime). Некоторые языки могут поддерживать одновременно как строгую так и слабую типизации.
- Битовые операции:
not
,and
,or
,xor
, сдвиг влево, сдвиг вправо juniorЧасто вместо
or
иand
используются символы|
/||
и&
/&&
. С битовыми операциями можно столкнуться чаще чем кажется, много функций/методов принимают опции в виде битовых флагов видаREAD|WRITE|CREATE
. Нужно уметь комбинировать битовые флаги, удалять, определять какие флаги установлены. - Обработка ошибок. Исключения, паники, error и прочие проявления ошибок.
- Проблемы в коде
- Бесконечные циклы
- Рекурсии
- Погрешность в числах с плавающей запятой (float, double, number).
- Ошибка сегментации (и ее связь с сигналом SIGSEGV)
- Примитивные типы данных
- Распараллеливание вычислений middle
Вычислять в один поток, используя 1 CPU, неимоверно удобно и просто. Однако в этом случае вы ограничены скоростью 1 CPU, что может занять много времени. Для ускорения сложных вычислений или действий использоют несколько CPU одной или нескольких машин. Но это будет "стоить" не дёшево.
- Процессы
- Создание дочернего процесса через fork.
- Поведение дескрипторов до и после fork.
- Разделяемая память (Shared memory)
- Межпроцессное взаимодействие (IPC)
- Потоки (threads)
В отличии от процессов, потоки имеют общую память, как следствие, всегда единую кодовую базу.
- Истинные потоки (pthreads, posix-threads)
- Зелёные потоки (Green threads)
Ведут себя как истинные потоки, но таковыми не являются, так как только эмулируют распараллеливание.
- КоРутины
Вариант распараллеливания, когда один код приложения, ожидающий событие системы, уступает CPU другому коду приложения. Выполняются-ли они параллельно - зависит от реализации.
- Проблемы распараллеливания
- Race Condition (aka race aka состояние гонки)
Как только у вас что-то может пойти параллельно у вас сразу же появится вероятность получить проблему RACE. На устранение или недопущение RACE всегда расходуются вычислительные ресурсы. И проблему RACE всегда сложно диагностировать. Поэтому параллелят вычисления только там где это остро необходимо.
- Deadlock
Как и в базах данных случается так что два или более параллельных вычисления ждут друг друга. И не дождутся.
- Race Condition (aka race aka состояние гонки)
- Атомарные операции
При работе в потоках, для избежания Race, языки реализовывают атомарные операция, позволяющие безопасно менять значения переменным.
- Блокировки
Чтобы избегать Race нужно использовать блокировки.
- Mutex (aka Мьютекс / aka mutual exclusion)
По сути это атомарная блокировка.
- Семафоры
Упрощенный вид mutex
- Mutex (aka Мьютекс / aka mutual exclusion)
- Процессы
- Пакетный менеджер или менеджер зависимостей. junior
- Расширения языка
Высокоуровневые языки, обычно, расширяются модулями, написанными на низкоуровневом языке, на котором написан сам обработчик языка.
- Отладчик (aka дебаггер)
Большую часть времени вы будете не писать новый код, а производить отладку уже написанного кода. В некоторых языках отладчик уже "встроен в язык", но некоторые языки требуют дополнительные модули или инструменты для этого.
- Запуск сервера и работа c ним в языке (обработка HTTP-запросов). junior
Некоторые языки в коде запускают сервера, а некоторые имеют отдельный сервер который запускает код. Может быть и то и то.
- Кэширование данных middle
- Частые алгоритмы кэша LRU, LFU
- Иные алгоритмы кэширования guru
⚡ - Прогревание кэша, инвалидация кэша
- Шаблонизация
Генерировать UI через
print
'ы очень плохая практика из-за множества проблем с поддержкой такого кода, с ростом проекта и контрибуторов. В вашем языке должны быть пакеты/модули для шаблонизации. И, как правило, их несколько. - Юнит тестирование junior
Ознакомление с системой тестирования в вашем языке. Подбор пакета/модуля для тестирования.
- Специфика работы IO (сокетов, дескрипторов, потоков) middle
- Буферы IO
- Асинхронный IO
Этап 9. Электронная почта
Работа с email, неотъемлемая часть web-разработки (да и не только). По факту, это единственный гарантированный канал связи с пользователем.
- Спецификация письма MIME junior
- Основные заголовки:
Return-Path
,Received
,From
,To
,Cc
,Bcc
,Reply-To
,Subject
,Message-ID
junior - прочие заголовки middle+
- указание кодировки junior
- кодирование полей и тела в base64 и qp (quoted-printable) middle
- Основные заголовки:
- Установка MailHog middle
Это почтовый сервер для тестирования работы отправки писем приложениями, который можно поднять локально в контейнере.
Этап 10. Полнотекстовый поиск
Каждый разработчик сталкивается с необходимостью полнотекстового поиска, да и в целом быстрого поиска по куче атрибутов и текстов. Для этого используются различные полнотекстовые поисковые движки такие как ElasticSearch, SphinxSearch, ManticoreSearch, MeiliSearch и т.д. Самый распространенный полнотекстовый поисковый движок с большим сообществом — ElasticSearch.
- Установить Cerebro для работы с ElasticSearch. junior
- Индексы junior
- Alias middle
- Настройки middle+
- Шаблоны middle
- Mapping middle
- Запросы junior
- Запросы поиска junior
- Запросы добавления/обновления/удаления документов junior
- bulk запросы middle
Запросы на изменение лучше делать пачкой, так называемым bulk-ом.
- painless-скриптинг middle+
потребуется чтобы точечно обновить некоторые поля у документа или вложенные документы, вместо всего документа
- Подключение или изменение морфологий junior
- Агрегации middle+
- Lucene индексы middle+
Основную работу по индексации и поиску выполняют Lucene-индексы. Сам ElasticSearch — кластер с HTTP-сервером, гарантирующий сохранность Lucene-индексов и отвечающий за их репликацию и шардирование. Если вам нужно чтобы была быстрая индексация и/или быстрый поиск то вам надо тюнить работу Lucene-индексов.
Этап 11. Логи и метрики
Метрики позволят узнать о проблеме, а логи позволят понять причину проблемы. Для крупных и/или распределённых систем этот тандем обязателен. Для обработки большого объёма данных нужны подходящие системы для сбора, хранения и агрегации. Любое приложение должно уметь генерировать полезные метрики для системы сбора и анализа метрик. И писать правильные системные логи о своих событиях. Логи о событиях пользователей уже относятся к аудиту, а не к системным логам.
- Системы хранения и обработки логов
Их на самом деле много, но среди бесплатных opensource, по популярности выделяются несколько
- Решение ELK middle+
Не самая тривиальная, но эффективная для приёма, обработки, хранения и работы с логами. ELK: Logstash - парсит логи, ElasticSearch - хранит логи, Kibana - UI для ElasticSearch для работы с логами.
- ClickHouse middle+
Колоночная база данных, которая отлично справляется с большим количеством логов (и не только access). Если проводить аналогию с ELK то: MaterializedView - позволяет парсить (структурированные) логи, семейство MergeTree — хранит логи. А вот UI только сторонний брать, например Grafana или Kibana.
- Grafana Loki
База данных для логов на базе Prometheus-like хранилищах с хорошей интеграцией с Grafana.
- Решение ELK middle+
- Prometheus или подобные, например, Victoria Metrics middle
Популярная система сбора и хранения метрик.
- Grafana middle+
Отличный UI для отображения метрик из разных систем хранения, включая Prometheus-like системы.
- Создание дашбордов
- Создание графиков
- Настройка алертов
Этап 12. Проектирование и разработка
Паттерны, концепции и подходы к проектированию различных web-приложений.
- Принципы разработки junior
- GRASP (General Responsibility Assignment Software Patterns) middle
- SOLID (Single Responsibility, Open–Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) middle
- KISS (Keep It Simple, Stupid) junior
- YAGNI (You Aren't Gonna Need It) junior
- DRY (Don’t Repeat Yourself) junior
- IoC (Inversion Of Control), и как следствие — DI (Dependency Injection) middle
- DDD (Domain-Driven Design) middle
- Архитектурные шаблоны junior
В одном проекте может быть один или несколько архитектурных шаблонов, или даже половина. Архитектурные шаблоны - подход к решению задачи, которую возложили на проект.
- Гексагональная архитектура middle+
- Event-Driven Architecture (aka Шаблон посредника или Broker pattern) middle+
- Onion Architecture (аkа Луковая архитектура или Многоуровневый шаблон) middle+
- CQRS (The Command and Query Responsibility Segregation) middle+
- SoA (Service-Oriented Architecture) middle+
- Event Sourcing middle+
- Шаблон MVC junior
Самый старый и достаточно распространённый шаблон проектирования приложения, разделяющий UI от логики приложения.
- Шаблон ADR (Action-Domain-Responder)
Доработка MVC под задачи веба
- Шаблон MVP junior
MVP - итерация развития MVC из-за усложнений приложений и UI. Часто используется во front-end - в браузере.
- Шаблон MVVM
На самом деле этот шаблон подходит для десктопных или мобильных приложений. В web приложениях практически не используется.
- Шаблоны проектирования
Шаблоны упрощают разработку, так как это, по сути, опыт сообщества по решению тех или иных проблем. Главное не забывайте про KISS и YAGNI, чтобы не упасть в ад абстракций и пучину сложности.
- Порождающие шаблоны проектирования
- Структурные шаблоны проектирования
- Поведенческие шаблоны проектирования
- Методологии разработки
Это не про scrum, agile, waterfall, планирование, проектирование и прочее. Это про методологии написания кода.
- TDD (Test Driven Development)
Разработка через тестирование, самый известный способ разработки, требующий от разработчика сначала - написание теста к коду, а потом самого кода.
- BDD (Behavior Driven Development)
Расширенная версия TDD, тем что сперва пишется не тест, а описание что нужно сделать, на предметном языке, например Gherken.
- TDD (Test Driven Development)
- Типы приложения
Существует разделение приложения по способу генерации UI.
- MPA (Multi-Page Application)
Классический тип приложения, с несколькими страницами генерируемыми на back-end для создания UI.
- SPA (Single Page Application)
Общее название типа приложения когда приложение живёт в браузере и ходит за данными на сервер. Может быть как SSG, SSR, CSR или любое их сочетание.
- SSG (Static Site Generation)
Все страницы приложения заранее генерируются в статичные файлы. Динамика полностью на JS. Может быть как и MPA так и SPA.
- SSR (Server Side Rendering)
Подход к генерации страниц приложения. Каждый запрос обрабатывается на сервере, где генерируется UI, а после сервер возвращает ответ клиенту на front-end.
- CSR (Client Side Rendering)
Подход к генерации страниц приложения. Весь UI генерируется в браузере при помощи JS. JS делает запросы на сервера за данными, для построения или изменения UI. SPA — частный случай CSR.
- PWA (Progressive Web Application)
Буквально ваш сайт в виде мобильного приложения.
- MPA (Multi-Page Application)
- Тестирование. junior
- Unit тестирование junior
Тестирование отдельных (в том числе отдельных друг от друга) частей продукта, обычно отдельных функций/методов. Unit-тесты так же несут ещё одну цель - проверка архитектуры вашей реализации. Как правило, если у вас не получается написать unit-тест на функцию/метод, не вовлекая сторонние компоненты приложения то возможно стоит пересмотреть архитектуру. Хорошее Unit-тестирование ведёт к хорошей инверсии контроля (IoC, см. выше)
- Интеграционные тесты middle
Сложный вид тестов. Проверка работоспособности приложения, модуля, компонентом с другим приложением, модулем, компонентом.
- End-to-End (aka E2E aka Сквозное тестирование) middle
Пример E2E теста - тестирование готового API приложения. Тестируются не компоненты приложения, а готовая функциональность.
- Smoke test (aka дымовые тесты) middle
Дымовые тесты позволяют протестировать саму возможность работать вашему приложению. Иногда используют для тестирования инфраструктуры на возможность работать в ней вашему приложению.
- Unit тестирование junior
- Проблемы приложений и проектирования. junior
- Технический долг. junior
Тех.долг начнёт копиться в проекте с первых строк кода. Всегда стоит его учитывать в разработке и планировать его устранение.
- Over engineering junior
Когда реализация намного больше или сложнее чем требуется. Потребует кучу ресурсов на поддержку проекта.
- Преждевременная оптимизация (aka Premature Optimization) junior
Прибегание к оптимизации там где она не требуется на данный момент. Отнимет кучу ресурсов на этапе разработки проекта.
- Технический долг. junior
- Приёмы рефакторинга
Чтобы избавляться от тех.долга придётся часто и много рефакторить.
- Антипаттерны
Полезно знать как следует делать, но не менее полезно знать как НЕ следует делать.
- Semver
Самый распространённый принцип наименования версий приложения. В некоторых языках и пакетных менеджерах является обязательным к соблюдению.
- Распределенные системы
Когда приложение упирается в потолок сервера то у вас только один выход - заставить приложение работать на нескольких серверах. Это сильно усложняет приложение и много ресурсов уходит на сохранение целостности и согласованности данных.
- Теоремы CAP и PACELC
В распределённых системах придётся чем-то жертвовать. PACELC - расширенная теорема CAP. Эти теоремы как раз описывают какими параметрами придётся пожертвовать системе.
- Микросервисная архитектура
- Теоремы CAP и PACELC