Что это? Этот документ содержит список (roadmap) навыков, которые часто требуются backend разработчику web-приложений. Документ разделён на этапы (темы), каждый этап разделён на пункты. Каждый пункт, в документе, подразумевает что:
- бекендер знает что это и какую проблему решает.
- бекендер знает для чего и когда следует применить.
- бекендер знает как с этим работать или знает где подсмотреть.
- при разработке или проектировании бекендер помнит про них и учитывает в приложении.
Принцип работы пункта будет дополнительным бонусом в понимании темы, но это может занять много времени. Изучайте по желанию и необходимости.
Как работать с документом? Этапы и пункты выстроены в рекомендуемом порядке для изучения. Просто следуйте сверху-вниз.
Как работать с пунктами документа? Каждый пункт легко гуглится и имеет страницу в 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. Проектирование
Для начала надо поднять виртуальную машину для экспериментов и исследований. Даже если уже имеете Linux на рабочей машине, всё равно поднимите виртуализацию. В случае чего, виртуальную машину всегда можно пересоздать. Есть много систем виртуализаций, но docker выделяется среди них. Docker - популярный инструмент для десктопной виртуализации, на серверах к нему прибегают в меньшей стемени, так как там больше популярен Kubernetes (aka k8s).
- установить docker junior
- запустить контейнер с Linux Ubuntu, последней LTS версией. Запустить bash (консоль) контейнера. junior
- установить удобное приложение для управления образами и контейнерами Kitematic, Portainer и тд. Либо сродниться с консольными командами docker. На некоторых OC десктопный docker уже имеет свой dashboard для управления образами и контейнерами. junior
- docker compose для поднятия кластера контейнеров. middle
Для рабочего приложения, как правило, требуется несколько различных сервисов (база данных, кешер, http сервер и тд) и всё это запихать в один docker контейнер будет проблемно, просто из-за специфики работы самого docker-а. Тут как раз поможет compose что бы запустить кучу контейнеров и подружить их между собой.
Изучить установленный в контейнере Linux. Linux, де-факто, является серверной ОС для большинства web-приложений. В этом разделе будет говориться о linux, хотя (почти) всё так же актуально и для других posix-совместимых систем. Например для bsd семейства, включая macos. Однако, могут быть отличия. В качестве стартового linux, обычно, выбирают Ubuntu, но можете взять самый компактный linux - Alpine, который часто используется в виртаулизации.
- Установка пакетов и обновление системы через
apt
/apt-get
у Ubuntu/Debian иapk
у alpine. juniorВ процессе исследований и различных проб придётся много раз ставить, обновлять и переустанавливать множество пакетов linux. Лучше сразу изучить как работают эти команды. Нужны бызовые операции: найти, установить, обновить, удалить.
- Базовые навыки в
bash
(улучшенныйsh
akashell
). juniorВ linux-подобных системах башом пронизано всё, вы гарантировано столкнётесь с ним и будут случаи когда надо будет писать 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Редакторы избыточны, что бы просто посмотреть содержимое файла. Просмотрщики так же справляется с не "стандартными" для редакторов файлами.
- Фоновые задачи, оператор
&
, команды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
- Файловая система 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
Некоторые пункты сложно категоризировать в этом документе. Но без них не обойтись. Это базовые вещи которые используются повсеместно в коде, в системах, "под капотом" вашего языка программирования.
- Регулярные выражения. Поиграться регулярными выражениями можно тут. Хоть каждый язык может иметь своё видение регулярных выражений, в общем смысле (и синтаксисе) они похожи. 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
Сеть в разработке самая важная и, часто, мало заметная часть.
- Базовое понимание работы сети. junior
- Протокол TCP middle
Вы вряд ли будете читать пакеты TCP. Но полезно знать КАК работает TCP, это позволит понять почему при идеальных "интернетах" всё равно приложение может лагать по сети.
- TCP пакет guru ⚡
- Флаги ACK, SYN, FIN и прочие middle+
- Буферы (window size) middle
- Проблемы TCP middle+
TCP очень старый протокол, который не удовлетворяет реалиям. На видео изобретают свой UDP протокол, рассматривая проблемы TCP и решая их в UDP.
- Протокол UDP. middle
Самый простой сетевой протокол семейства. Требуется понимание его работы. HTTP/3.0, DNS работает на протоколе UDP, и понимание UDP даст немного понимания в работе HTTP/3.0
- UDP пакет guru ⚡
- Протокол TCP middle
- Проблемы сети. junior
Их, как всегда, много. Но стоит выделить те которые явно влияют на скорость работы сети. По большей части эти проблемы присущи TCP, но могут появиться и там где эмулируют TCP на другом протоколе (например UDP)
- Packet loss junior
- Reordering middle
- Jitter middle
- Round-Trip Time (RTT aka лаг) junior
- 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
- Трассировки маршрутов. middle
- Анализ трафика через
tcpdump
+wireshark
guru ⚡Не простой, но очень эффективный способ "увидеть" и проанализировать трафик в удобном UI.
- Упороться сетью полностью 🇺🇸 guru ⚡
Без баз данных — никуда. Самый частый вид баз данных — реляционные базы данных. Поэтому даже junior должен уметь работать с ними, а вот с noSQL можно знакомится на поздних стадиях.
- SQL базы данных MySQL/Postgres/итд. junior
MySQL подразумевает как MySQL от Oracle, так и различные варианты в виде MariaDB, Percona XTraDB и тд. В общем понимании сеймества MySQL/Postgres/MSSQL/итд имеют схожие SQL API, различаются только внутренней реализацией, производительностью и масштабироемостью. Тут будет упор на MySQL семейство, которое очень распространено.
- Базовый синтаксис запросов
SELECT
/INSERT
/UPDATE
/DELETE
. junior - Создание и модификация таблиц junior
- Типы колонок таблиц их назначение их различие (на примере MySQL и схожих) junior
- tinyint/smallint/int/bigint
- tinytext/text/mediumtext/longtext
- set/enum
- char/varchar
- decimal
- double
- прочие
- Создание и применение ALTER запросов. junior
- Типы колонок таблиц их назначение их различие (на примере MySQL и схожих) junior
- Анализ выполнения запросов через
EXPLAIN
, понимание результатовEXPLAIN
. juniorСамый действенный способ понять почему тормозит запрос.
- Ведение логов медленных запросов — slow_log. middle
Не получится сидеть всё время, мониторя все запросы. Проще настроить агрегацию медленных запросов.
- Индексы junior
Индексы очень важная часть баз данных. Ваши запросы всегда должны работать "по индексам". Запрос без индекса или с "плохим" индексом, на нагруженных проектах, гарантировано может привести к падению проекта.
- Назначение PRIMARY индексов junior
- Назначение 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
- Базовый синтаксис запросов
- Документо-ориентированная база данных (часть 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+
Каждый 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/1.0, HTTP/1.1 middle
Не смотря появление новых версий протоколов HTTP версии HTTP/1.0 и HTTP/1.1 всё еще остаются частыми во внутренних сетях кластеров.
- Консольные команды HTTP запросов
curl
,wget
juniorНа серверах (хостах) нет браузеров, чью удобную консоль можно использовать. Там есть shell и множество утилит, которые умеют в HTTP.
- HTTP/2.0 протокол и HTTP/3.0 middle+
- WebSocket протокол middle
Это расширения HTTP/1.1 и более до механизма обмена данными по одному соединению. Часто используется для чатов и/или для event-driven модели.
- WebRTC guru ⚡
Если надо будет организовывать p2p чаты или p2p стриминг, то WebRTC как раз для этого.
- HTTP API форматы junior
- Web сервера junior
- Nginx. junior
Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - велика.
- Ознакомление с базовыми возможностями junior
- Масштабируемая конфигурация nginx middle
- Написание простых локаций в
/etc/nginx/nginx.conf
раздачи файлов junior - HTTP, FastCGI проксирование junior
- Nginx. junior
Ваше приложение всегда под угрозой, даже если это какая-то home-page. Ботнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).
- Виды управления доступом middle
- Access Control List (ACL) middle
- Role-based access control (RBAC) middle
- Attribute-based access control (ABAC) middle
- Аутентификация junior
- Basic junior
Самый простой вид авторизации, не требующий дополнительных вычислительных мощностей (серверов).
- OAuth2 middle
Распространенный вид авторизации через посредника, который гарантирует что Вы это Вы и может выдать некоторые данные по пользователю, с его согласия. Часто сталкиваются c OAuth2 тогда когда надо подключить авторизацию через соц. сети. У них у всех 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
Языков программирования много. Однако, они имеют много общего между собой, кто-то больше, а кто-то меньше. Этап будет задевать только часто встречающиеся пункты в большинстве популярных языков программирования. Этап не будет чётко дробиться на градации, так как многое зависит от самого языка, его возможностей и его расширений.
Принцип работы с этим разделом: ищите %ваш_язык_программирования% %пункт_из_этапа%
.
Учтите, что некоторых пунктов может не быть в вашем языке.
- Что такое интерпретатор, компилятор, JIT, оп-код, байт-код. Что из этого использует ваш язык? junior
- Ваш язык программирования junior
- Примитивные типы данных
Базовые скалярные типы — целые числа, строки, true/false, числа с плавующей точкой, null/nil и так далее.
- Набор, массив, хеш-таблица (ассоциативный массив), кортеж.
Представляет собой различные комбинации примитивных типов. Например числовой массив данных можно сделать почти в любом языке.
- Объекты/классы/прототипы/структуры.
- Ссылки, слабые ссылки.
- Garbage Collector (GC).
Много языков высокого (и не только) уровня имеют GC. GC отвечает за особождение памяти от мусора (забытые данные, данные которые уже не нужны коду) в процессе работы кода. Это очень важная часть вашего языка, так как пока работает GC — не работает ваш код. А если GC будет часто и/или много работать то ваше приложение начнет лагать и "зависать".
- Когда и как запускается GC.
- Изучить настройки GC.
- Включение/выключение GC, принудительный запуск GC.
- Преобразование типов.
- Слабая/сильная типизация в коде. На что влияет и как с этим жить.
Сильная типизация требует явного указания в коде типа данных, которые будут использоваться в перменной, аргументе и тд. А динамическая, наоборот, позволяет не укаывать типа. Вычисление типа значения будет происходить динамически, прямо на ходу. Некоторые языки могут поддерживать одноверменно как строгую типизацию так и слабую.
- Битовые операции:
not
,and
,or
,xor
, сдвиг влево, сдвиг вправо juniorЧасто вместо
or
иand
используются символы|
и&
. С битовыми операциями можно столкнуться чаще чем кажется, много функций/методов принимают опции в виде битовых флагов видаREAD|WRITE|CREATE
. Нужно уметь комбинировать битовые флаги, их удалять, определять какие флаги установлены. - Обработка ошибок. Исключения, паники, error и прочие проявления ошибок.
- Проблемы в коде
- Бесконечные циклы
- Рекурсии
- Ошибка сегментации (и ее связь с сигналом SIGSEGV)
- Примитивные типы данных
- Распараллеливание middle
- Процессы
- Создание дочернего процесса через fork.
- Поведение дескрипторов до и после fork.
- Разделяемая память (Shared memory)
- Межпроцессное взаимодействие (IPC)
- Потоки (threads)
В отличии от процессов, потоки имеют общую память, как следствие, всегда единую кодовую базу.
- Истинные потоки (pthreads, posix-threads)
- Зелёные потоки (Green threads)
Ведут себя как истинные потоки, но таковыми не являются, так как только эмулируют распараллеливание.
- КоРутины
Вариант распарелливания, когда один код приложения, ожидающий событие системы, уступает CPU другому коду приложения. Выполняются-ли они параллельно - зависит от реализации.
- Проблемы распараллеливания
- Race Condition (aka race)
- Атомарные операции
При работе в потоках, для избежания Race, языки реализовывают атомарные операция, позволяющие безопасно менять значения переменным.
- Блокировки
Что бы избегать Race нужно использовать блокировки.
- Mutex (aka Мьютекс aka mutual exclusion)
По сути это атомарная блокировка.
- Семафоры
Упрощенный вид mutex
- Mutex (aka Мьютекс aka mutual exclusion)
- Процессы
- Пакетный менеджер или менеджер зависимостей. junior
- Расширения языка
Высокоурвоневые языки, обычно, расширяются модулями, написанными на низкоуровневом языке, на котором написан сам обработчик языка.
- Запуск сервера и работа c ним в языке (обработка HTTP запросов). junior
Некоторые языки в коде запусают сервера, а некоторые имею отдельный сервер который запускает код. Может быть и то и то.
- Кеширование данных middle
- Частые алгоритмы кеша LRU, LFU
- Иные алгоритмы кеширования guru ⚡
- Прогревание кеша, инвалидация кеша
- Шаблонизация
Генерировать UI через
print
-ы очень плохая практика из-за множества проблем с поддержкой такого кода с ростом проекта и контрибуторов. В вашем языке должны быть пакеты/модули для шаблонизации. И, как правило, их несколько. - Юнит тестирование junior
Ознакомление с системой тестирования в вашем языке. Подбор пакета/модуля для тестирования.
- Специфика работы IO (сокетов, дескрипторов, потоков) middle
- Буферы IO
- Асинхронный IO
Работа с email неотъемлемая часть web разработки (да и не только). По факту, это едиственный гарантированный канал связи с пользователем.
- Спецификация письма MIME middle
- Основные заголовки:
Return-Path
,Received
,From
,To
,Cc
,Bcc
,Reply-To
,Subject
,Message-ID
middle - прочие заголовки middle+
- указание кодировки middle
- кодирование полей и тела в base64 middle
- Основные заголовки:
- Установка MailHog middle
Это почтовый сервер для тестирования работы отправки писем приложениями, который можно поднять локально в контейнере.
Каждый разработчик сталкивается с необходимостью полнотекстового поиска, да и в целом быстрого поиска по куче аттрибутов и текстов. Для этого используются различные полнотекстовые поисковые движки такие как 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+
- Работа с nested-документами middle
- Lucene индексы middle+
Основную работу по индексации и поиску выполняют Lucene-индексы. Сам ElasticSearch — кластер с HTTP сервером, гарантирующий сохранность Lucene-индексов и отвечающий за их репликацию и шардирование. Если вам нужно что бы была быстрая индексация и/или быстрый поиск то вам надо тюнить работу Lucene-индексов.
Метрики позволят узнать о проблеме, а логи позволят понять причину проблемы. Для крупных и/или распределённых систем этот тандем обязателен. Для обработки большого объёма данных нужны подходящие системы для сбора, хранения и агрегации. Любое приложение должно уметь генерировать полезные метрики для системы сбора и анализа метрик. И писать правильные систменые логи о своих событиях. Логи о событиях пользователей уже относится к аудиту, а не к системным логам.
- Системы хранение и обработка логов
Их на самом деле много, но среди бесплатных opensource, по популярности выделяются несколько
- Решение ELK middle+
Не самая тривиальная, но эффективная для приёма, обработки, хранения и работы с логами. ELK: Logstash - парсит логи, ElasticSearch - хранит логи, Kibana - UI для ElasticSearch для работы с логами.
- ClickHouse middle+
Колоночная база данных, которая отлично справляется с большим количеством логов (и не только access). Если проводить аналогию с ELK то: MaterializedView - позволяет парсить (структурированные) логи, семейство MergeTree — хранит логи. А вот UI только сторонний брать, например Grafana или Kibana.
- Решение ELK middle+
- Prometheus или подобные, например, Victoria Metrics middle
Популярная система сбора и хранения метрик.
- Grafana middle+
Отличный UI для отображения метрик из разных систем хранения, включая Prometheus-like системы.
- Создание дашбордов
- Создание графиков
- Настройка алертов
Паттерны, концепции и подходы к проектированию различных 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+
- Шаблон MVC junior
Самый старый и достаточно распространённый шаблон проектирования приложения, разделяющий UI от логики приложения.
- Шаблон 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
- SPA (Single Page Application)
Общее название подхода когда приложение живёт в браузере и ходит за данными на сервер. Может быть как SSG, SSR, SSR или любое их сочетание.
- SSG (Static Site Generation)
Все страницы приложения заранее генерируются в статичные файлы. Динамика полностью на JS.
- SSR (Server Side Rendering)
Типовой вид приложения. Каждый запрос обрабатывается на сервере, где ответ - UI.
- CSR (Client Side Rendering)
Весь UI отрисовывается в браузере при помощи JS. JS делает запросы на сервера за данными, для отрисовки.
- Тестирование
- Unit тестирование
Тестирование отдельных (в том числе отдельных друг от друга) частей продукта, обычно отдельных функций/методов. Unit-тесты так же несут ещё одну цель - проверка архитектуры вашей реализации. Как правило, если у вас не получается написать unit-тест на функцию/метод, не вовлекая сторонние компоненты приложения то возможно стоит пересмотреть архитектуру. Хорошее Unit-тестирование ведёт к хорошей инверсии котроля (IoC, см выше)
- Интеграционные тесты
- End-to-End (aka E2E aka Сквозное тестирование)
Пример E2E теста - тестирование готово HTTP API приложения. Тестируются не компоненты приложения, а готовая функциональность.
- Smoke test (aka дымовые тесты)
Дымовые тесты позволяют протестировать саму возможность работать вашему приложению. Иногда используют для тестирования инфрастуктуры на возможность работать в ней вашему приложению.
- Unit тестирование
- Приёмы рефакторинга
- Антипаттерны
Полезно знать как следет делать, но не менее полезно знать как НЕ следует делать.
- Semver
Самый распространённый принцип наименования версий приложения. В некоторых языках и пакетных менеджерах является обязательным к соблюдению.
- Распределенные системы
Когда приложение упирается в потолок сервера то у вас только один выход - заставить приложение работать на нескольких серверах. Это сильно усложняет приложение и много ресурсов уходит на сохранение целостности и согласованности данных.
- Теоремы CAP и PACELC
В распределённых системах придётся чем-то жертвовать. PACELC - расширенная теорема CAP. Эти теоремы как раз описывают какими параметрами придётся пожертвовать системе.
- Микросервисная архитектура
- Теоремы CAP и PACELC