Skip to content

Latest commit

 

History

History
786 lines (738 loc) · 89.6 KB

README.md

File metadata and controls

786 lines (738 loc) · 89.6 KB

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).

  1. установить docker junior
  2. запустить контейнер с Linux Ubuntu, последней LTS версией. Запустить bash (консоль) контейнера. junior
  3. установить удобное приложение для управления образами и контейнерами Kitematic, Portainer и т.д. Либо сродниться с консольными командами docker. На некоторых OC десктопный docker уже имеет свой dashboard для управления образами и контейнерами. junior
  4. docker compose для поднятия кластера контейнеров. middle

    Для рабочего приложения, как правило, требуется несколько различных сервисов (база данных, кэшер, http-сервер и т.д.) и всё это упаковать в один docker контейнер будет проблемно, просто из-за специфики работы самой виртуализации. Тут как раз поможет compose чтобы запустить кучу контейнеров и подружить их между собой.

Этап 2. Linux

Изучить установленный в контейнере — Linux. Linux, де-факто, является серверной ОС для большинства web-приложений. В этом разделе будет говориться о Linux, хотя (почти) всё так же актуально и для других posix-совместимых систем. Например для bsd семейства, включая MacOS. Однако, могут быть отличия. В качестве стартового дистрибутива Linux, обычно, выбирают Ubuntu, но вы можете взять самый компактный - Alpine, который часто используется в виртуализации.

  1. Установка пакетов и обновление системы через apt/apt-get в Ubuntu/Debian и apk в Alpine. junior

    В процессе исследований и различных проб придётся много раз ставить, обновлять и переустанавливать множество пакетов Linux. Лучше сразу изучить как работают эти команды. Нужны базовые операции: найти, установить, обновить, удалить.

  2. Базовые навыки в 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 ⚡
  3. Понятие процесс. junior

    Как и во всех других ОС, в Linux запущенные приложения представляются процессами.

    • Команды анализа процессов top, htop, ps (ps aux). junior

      Этакий "диспетчер задач" в мире Linux, позволяющий мониторить процессы системы.

    • Родительский процесс, дочерний процесс. middle

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

    • Мастер-воркер процессы, демон (daemon). middle

      Это один из распространённых видов распараллеливания вычислений в приложениях. Много программ используют именно такой подход распараллеливания.

    • Зомби-процессы. Откуда берутся и как с ними бороться. middle+

      Это вид проблемы распараллеливания вычислений через дочерние процессы. Возникает когда у мастер-процесса есть проблемы или баги.

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

      Это основной рычаг воздействия на процессы сторонними приложениями (системными или вашими).

    • Системный вызов (syscall). middle+

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

    • Команда анализа системных вызов процесса через strace. middle+

      Самый простой и доступный способ посмотреть какие системные вызовы делает процесс в реальном времени.

  4. Изучение понятия дескриптор. middle

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

    • Стандартные дескрипторы STDIN, STDOUT, STDERR и их нумерация. middle

      Любой поток в процессе пронумерован и есть "зарезервированные" номера под определенные потоки.

    • Потоки, сокеты и unix-сокеты. middle

      Это всё разновидности дескрипторов с которыми придётся работать. На всех них распространяются правила дескрипторов, ну так как они и есть дескрипторы.

    • Ограничение на дескрипторы. middle+

      Не редкая проблема приложений когда оно упирается в лимит открытых дескрипторов.

    • Команда анализа открытых дескрипторов у процесса через lsof. middle+

      Для отладки приложения всегда надо знать с чем ведёт общение приложение (отлично работает в паре с strace, сопоставляя номера дескрипторов).

  5. Пользователи junior
    • Пользователь root. junior

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

    • Супер пользователь, команды su и sudo. junior

      Никто не даст вам root на проде, но вполне можете иметь "привилегированного" пользователя, который умеет в sudo.

  6. Файловая система junior
    • Команда stat junior
    • Права и доступы файловой системы junior

      Избыточные доступы ведут к дыре в безопасности, недостаток доступов ведёт к багам в приложении. Осмысленно ставьте где x (особенно у директорий), где r, а где w.

    • Понимание описания доступов вида --xr-xrwx и 0137 (восьмеричная) у файлов и директорий. junior

      Обычно в таком виде вы будете видеть уровни доступов в консолях.

    • Исполняемые файлы, sha bang. junior
    • Изменение прав доступов через команды chmod, chown. middle
    • Работа с дисками middle+

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

  7. Ссылки на файловой системе. junior
    • Symlink (aka символическая ссылка). junior

      Самый распространённый вид ссылки. Повсеместно используется в Linux да и пакетных менеджерах разных языков. Вы тоже будете это использовать.

    • Hardlink (aka жесткая ссылка). middle

      Редкий случай использования ссылки. Потребуется если надо "дедуплицировать" большой объём файлов. По сути позволяет создать несколько имён одному файлу.

  8. Запуск и остановка сервисов systemd. middle

    Linux по сути просто пачка запущенных приложений как сервисов.

  9. SSH. junior

    Самый доступный способ запустить shell на удалённой машине это использовать SSH. Используется повсеместно.

    • Генерация собственного ssh-rsa ключа через ssh-keygen. junior

      Без него вы не попадёте на хосты по SSH.

    • Использование публичного ssh-rsa ключа для входа на удалённую машину (используйте второй контейнер с Linux). junior
  10. Перенос контента. junior

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

    • scp junior

      самый простой инструмент переноса файлов между хостами по ssh.

    • rsync middle

      пожалуй самый мощный инструмент переноса файлов между хостами с кучами настроек, правил и протоколов.

    • rclone middle

      "rsync" для облачных хранилищ. Универсальный инструмент для работы с контентом, который хранится в облаках или где-то по сети.

  11. Планировщики задач
    • Команда crontab и запуск crond.

      Самый распространённый и простой планировщик задач, с весьма гибкими настройками расписания

    • Команда at middle

      Когда хотите запустить задачу разово, к определенному времени. В crontab это потребует отдельно создавать расписание, что сильно затрудняет автоматику и захламляет всё расписание.

  12. Оперативная память. middle
    • Команда free, мета информация /proc/meminfo. middle

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

    • Ошибка Out Of Memory (OOM) и причина появления. OOM-киллер. middle+

      Именно это происходит когда вы превысили все допустимые пределы потребления памяти в системе.

  13. Логи системы. Для чего и как посмотреть. middle

    Когда случаются проблемы то логи — единственное, что может навести на суть проблемы. Помимо логов приложения стоит заглядывать в логи системы, иногда её проблема может вести к проблеме в приложениях. Стоит выделить некоторые логи:

    • dmesg (driver messages) — важные сообщения от компонентов Linux, включая от OOM-киллера. middle
    • syslog — системный журнал. middle

      Там могут быть сообщения от ядра Linux, различных служб, сетевых интерфейсов и многого другого.

  14. Проблемы в Linux и последствия. junior

    Их много, но выделим только несколько.

    • Kernel panic. junior

      BSoD аналог для Linux. Самая не приятная ошибка системы, явно намекающая, что система не стабильна.

    • Segmentation fault (aka segfault aka сегфолт). middle

      Не такая уж и редкая ошибка приложений, как хотелось бы. Приложение попыталось работать с памятью доступа к которой у неё нет.

    • Core dump (aka корка). middle+

      Результат обработки segmentation fault системой. Корка может потребоваться разработчику упавшего приложения для анализа состояния программы на момент падения.

Этап 3. Общие знания

Некоторые пункты сложно категоризировать в этом документе. Но без них не обойтись. Это базовые вещи которые используются повсеместно в коде, в системах, "под капотом" вашего языка программирования.

  1. Регулярные выражения. Поиграться регулярными выражениями можно тут. Хоть каждый язык может иметь своё видение регулярных выражений, в общем смысле (и синтаксисе) они похожи. middle

    Рано или поздно придётся спарсить данные из текста или проверять данные, вот тут как раз и потребуются регулярные выражения.

  2. Криптография. junior

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

    • Хеши и хеш-функции, в том числе crc32, md5, sha1, sha256. junior
    • Цифровые подписи. junior

      Чтобы обезопасить от подделки данных используются цифровые подписи этих же данных.

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

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

    • Коллизии хешей. middle

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

    • Симметричное и асимметричное шифрование. middle+

      Иногда приходится шифровать данные и важно выбрать стратегию шифрования.

    • Принцип работы TLS. middle+

      Имеется ввиду как работаю CA корневые и промежуточные, что стоит за сертификатом.

  3. Базовая работа с git. junior

    По факту это дефолтная система контроля версий в мире IT.

    • Коммит изменений (commit) junior
    • Отправка изменений (push/pull) junior
    • Создание веток и тегов (branch/tag) junior
    • Слияние веток (merge) junior
    • Упороться полностью git'ом guru ⚡
  4. Структуры данных. junior
    • Хеш таблицы. middle

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

    • Очередь и стек. junior

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

    • Связный список и двусвязный список. middle

      Эти структуры данных часто используются в разработке так как являются самым простым способом связать элементы с собой. Они так же активно используются внутри вашего языка (под "капотом") повсеместно.

  5. Форматы хранения и передачи данных
    • Текстовые. junior

      Текстовые форматы используются так же для хранения конфигурации приложений

      • JSON
      • YAML
      • XML
    • Бинарные. middle

      Бинарные форматы используются сугубо для хранения и передачи данных.

      • MessagePack
      • BSON (бинарный аналог JSON)
      • ProtoBuf

Этап 4. Сеть

Сеть в разработке самая важная и, часто, мало заметная часть.

  1. Базовое понимание работы сети. 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.

  2. Проблемы сети. junior

    Их, как всегда, много. Но стоит выделить те, которые явно влияют на скорость работы сети. По большей части эти проблемы присущи TCP, но могут появиться и там где эмулируют TCP — на другом протоколе (например UDP)

    • Packet loss junior
    • Reordering middle
    • Jitter middle
    • Round-Trip Time (RTT aka лаг) junior
    • Сетевое ожидание (Network latency, задержка) middle
  3. IPv4, IPv6.

    Базовое отличие протоколов надо знать, хотя бы, чтобы правильно создать колонку IP в базе и обработку в коде.

  4. 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.

  5. Трассировки маршрутов. middle
  6. Анализ трафика через tcpdump + wireshark guru ⚡

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

  7. Упороться сетью полностью 🇺🇸 guru ⚡

Этап 5. Базы данных

Без баз данных — никуда. Самый частый вид баз данных — реляционные базы данных. Поэтому даже junior должен уметь работать с ними, а вот с NoSQL базами данных можно ознакомиться чуть позже.

  1. Реляционные базы данных 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

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

  2. Документо-ориентированная база данных (часть NoSQL баз данных) — MongoDB. middle

    Среди всех NoSQL самой популярной является MongoDB.

    • Типы данных в коллекциях, их назначение и различия. middle
    • Анализ выполнения запросов через explain(), понимание его результатов. middle
    • Понимание работы индексов (аналогично SQL индексам с небольшими отличиями). middle
      • Sparse свойство индекса
      • Partial свойство индекса
      • TTL свойство индекса
      • Geospatial индекс
      • Text индекс
    • Вложенные объекты, массивы. middle
    • Агрегации middle+
    • Работа с репликацией. middle+
    • Работа с кластером MongoDb. middle+
  3. Redis junior

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

  4. Проблемы в базах данных junior
    • Deadlock middle
    • Переполнение числовых полей (в том числе autoincrement) junior
    • Full scan middle
    • Split-brain middle+

Этап 6. Протокол HTTP

Каждый WEB разработчик должен понимать протокол HTTP. Разработчик который не знает HTTP протокол — это как сапожник без сапог. Поэтому даже junior должен многое знать про протокол HTTP.

  1. Понимание общего формата протокола: где заголовки, а где тело. junior
  2. Сродниться со вкладкой Сеть/Network в инспекторе браузера junior

    В консоли можно наблюдать все HTTP-запросы со страницы и даже делать самим через функцию fetch.

  3. Методы HTTP-запросов. Их назначение и ограничения. junior

    Каждый метод имеет своё назначение (достаточно перевести названия методов) и, как следствие, имеет свои условности и ограничения.

    • Основные GET, POST, HEAD junior
    • Дополнительные PUT, DELETE, PATCH middle

      Используются в REST API вместе с основными методами

    • Прочие middle+

      Это уже методы узкой направленности, редко когда придётся с ними напрямую работать. Тем не менее они активно используются приложениями.

  4. Коды 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
  5. Заголовки HTTP junior
  6. Куки junior

    На данный момент это единственный точный способ идентифицировать пользователя.

  7. Cross-Origin Resource Sharing (CORS) middle

    Для кросс-доменных XHR/WebSocket запросов надо научиться работать с CORS, иначе запросы не будут работать.

  8. Content-Security-Policy (CSP) middle

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

  9. Различия версий протокола HTTP: HTTP/1.0, HTTP/1.1 middle

    Не смотря на появление новых версий протокола HTTP, версии HTTP/1.0 и HTTP/1.1 всё еще остаются частыми во внутренних сетях кластеров.

  10. Консольные команды HTTP запросов curl, wget junior

    На серверах (хостах) нет браузеров, чью удобную консоль можно использовать. Там есть shell и множество утилит, которые умеют работать с HTTP.

  11. Различия протоколов HTTP/1.1, HTTP/2.0 и HTTP/3.0 middle+

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

  12. WebSocket протокол middle

    Это расширения версии HTTP/1.1 и выше для механизма обмена данными по одному соединению. Часто используется для чатов и/или для event-driven модели.

  13. WebRTC guru ⚡

    Если надо будет организовывать P2P (peer-to-peer) чаты или P2P стриминг, то WebRTC как раз для этого.

  14. HTTP API форматы junior
  15. Web сервера junior
    • Nginx. junior

      Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - высока.

    • Apache httpd. junior

      Один из старых, но активно использующихся Web-серверов широкого профиля. Хоть он уже и уступает nginx-у в популярности, но столкнуться с ним в проекта есть всё так же легко.

Этап 7. Безопасность

Ваше приложение всегда под угрозой, даже если это какое-то home-page приложение. Ботнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).

  1. Виды управления доступом middle
  2. Аутентификация 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

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

  3. Виды атак и уязвимостей 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. Тут должен быть ваш язык программирования

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

Принцип работы с этим разделом: ищите %ваш_язык_программирования% %пункт_из_этапа%. Учтите, что некоторых пунктов может не быть в вашем языке.

  1. Что такое интерпретатор, компилятор, JIT, оп-код, байт-код. Что из этого использует ваш язык? junior
  2. Ваш язык программирования 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)
  3. Распараллеливание вычислений 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, языки реализовывают атомарные операция, позволяющие безопасно менять значения переменным.

    • Блокировки

      Чтобы избегать Race нужно использовать блокировки.

      • Mutex (aka Мьютекс / aka mutual exclusion)

        По сути это атомарная блокировка.

      • Семафоры

        Упрощенный вид mutex

  4. Пакетный менеджер или менеджер зависимостей. junior
  5. Расширения языка

    Высокоуровневые языки, обычно, расширяются модулями, написанными на низкоуровневом языке, на котором написан сам обработчик языка.

  6. Отладчик (aka дебаггер)

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

  7. Запуск сервера и работа c ним в языке (обработка HTTP-запросов). junior

    Некоторые языки в коде запускают сервера, а некоторые имеют отдельный сервер который запускает код. Может быть и то и то.

  8. Кэширование данных middle
  9. Шаблонизация

    Генерировать UI через print'ы очень плохая практика из-за множества проблем с поддержкой такого кода, с ростом проекта и контрибуторов. В вашем языке должны быть пакеты/модули для шаблонизации. И, как правило, их несколько.

  10. Юнит тестирование junior

    Ознакомление с системой тестирования в вашем языке. Подбор пакета/модуля для тестирования.

  11. Специфика работы IO (сокетов, дескрипторов, потоков) middle
    • Буферы IO
    • Асинхронный IO

Этап 9. Электронная почта

Работа с email, неотъемлемая часть web-разработки (да и не только). По факту, это единственный гарантированный канал связи с пользователем.

  1. Спецификация письма MIME junior
    • Основные заголовки: Return-Path, Received, From, To, Cc, Bcc, Reply-To, Subject, Message-ID junior
    • прочие заголовки middle+
    • указание кодировки junior
    • кодирование полей и тела в base64 и qp (quoted-printable) middle
  2. Установка MailHog middle

    Это почтовый сервер для тестирования работы отправки писем приложениями, который можно поднять локально в контейнере.

Этап 10. Полнотекстовый поиск

Каждый разработчик сталкивается с необходимостью полнотекстового поиска, да и в целом быстрого поиска по куче атрибутов и текстов. Для этого используются различные полнотекстовые поисковые движки такие как ElasticSearch, SphinxSearch, ManticoreSearch, MeiliSearch и т.д. Самый распространенный полнотекстовый поисковый движок с большим сообществом — ElasticSearch.

  1. Установить Cerebro для работы с ElasticSearch. junior
  2. Индексы junior
    • Alias middle
    • Настройки middle+
    • Шаблоны middle
    • Mapping middle
  3. Запросы junior
    • Запросы поиска junior
    • Запросы добавления/обновления/удаления документов junior
    • bulk запросы middle

      Запросы на изменение лучше делать пачкой, так называемым bulk-ом.

    • painless-скриптинг middle+

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

  4. Подключение или изменение морфологий junior
  5. Агрегации middle+
  6. Lucene индексы middle+

    Основную работу по индексации и поиску выполняют Lucene-индексы. Сам ElasticSearch — кластер с HTTP-сервером, гарантирующий сохранность Lucene-индексов и отвечающий за их репликацию и шардирование. Если вам нужно чтобы была быстрая индексация и/или быстрый поиск то вам надо тюнить работу Lucene-индексов.

Этап 11. Логи и метрики

Метрики позволят узнать о проблеме, а логи позволят понять причину проблемы. Для крупных и/или распределённых систем этот тандем обязателен. Для обработки большого объёма данных нужны подходящие системы для сбора, хранения и агрегации. Любое приложение должно уметь генерировать полезные метрики для системы сбора и анализа метрик. И писать правильные системные логи о своих событиях. Логи о событиях пользователей уже относятся к аудиту, а не к системным логам.

  1. Системы хранения и обработки логов

    Их на самом деле много, но среди бесплатных opensource, по популярности выделяются несколько

    • Решение ELK middle+

      Не самая тривиальная, но эффективная для приёма, обработки, хранения и работы с логами. ELK: Logstash - парсит логи, ElasticSearch - хранит логи, Kibana - UI для ElasticSearch для работы с логами.

    • ClickHouse middle+

      Колоночная база данных, которая отлично справляется с большим количеством логов (и не только access). Если проводить аналогию с ELK то: MaterializedView - позволяет парсить (структурированные) логи, семейство MergeTree — хранит логи. А вот UI только сторонний брать, например Grafana или Kibana.

    • Grafana Loki

      База данных для логов на базе Prometheus-like хранилищах с хорошей интеграцией с Grafana.

  2. Prometheus или подобные, например, Victoria Metrics middle

    Популярная система сбора и хранения метрик.

    • Типы метрик middle
      • count
      • gauge
      • histogram
      • summary
    • Варианты отправки метрик: push и pull middle
    • Запросы (лучше и наглядней делать из Grafana) middle
      • Синтаксис middle
      • Лейблы
      • Векторы
      • Интервалы
      • Операторы
    • Функции, особенно стоит выделить 2 из них: middle
      • rate
      • irate
  3. Grafana middle+

    Отличный UI для отображения метрик из разных систем хранения, включая Prometheus-like системы.

    • Создание дашбордов
    • Создание графиков
    • Настройка алертов

Этап 12. Проектирование и разработка

Паттерны, концепции и подходы к проектированию различных web-приложений.

  1. Принципы разработки 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
  2. Архитектурные шаблоны 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 приложениях практически не используется.

  3. Шаблоны проектирования

    Шаблоны упрощают разработку, так как это, по сути, опыт сообщества по решению тех или иных проблем. Главное не забывайте про KISS и YAGNI, чтобы не упасть в ад абстракций и пучину сложности.

    • Порождающие шаблоны проектирования
    • Структурные шаблоны проектирования
    • Поведенческие шаблоны проектирования
  4. Методологии разработки

    Это не про scrum, agile, waterfall, планирование, проектирование и прочее. Это про методологии написания кода.

    • TDD (Test Driven Development)

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

    • BDD (Behavior Driven Development)

      Расширенная версия TDD, тем что сперва пишется не тест, а описание что нужно сделать, на предметном языке, например Gherken.

  5. Типы приложения

    Существует разделение приложения по способу генерации 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)

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

  6. Тестирование. junior
    • Unit тестирование junior

      Тестирование отдельных (в том числе отдельных друг от друга) частей продукта, обычно отдельных функций/методов. Unit-тесты так же несут ещё одну цель - проверка архитектуры вашей реализации. Как правило, если у вас не получается написать unit-тест на функцию/метод, не вовлекая сторонние компоненты приложения то возможно стоит пересмотреть архитектуру. Хорошее Unit-тестирование ведёт к хорошей инверсии контроля (IoC, см. выше)

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

      Сложный вид тестов. Проверка работоспособности приложения, модуля, компонентом с другим приложением, модулем, компонентом.

    • End-to-End (aka E2E aka Сквозное тестирование) middle

      Пример E2E теста - тестирование готового API приложения. Тестируются не компоненты приложения, а готовая функциональность.

    • Smoke test (aka дымовые тесты) middle

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

  7. Проблемы приложений и проектирования. junior
    • Технический долг. junior

      Тех.долг начнёт копиться в проекте с первых строк кода. Всегда стоит его учитывать в разработке и планировать его устранение.

    • Over engineering junior

      Когда реализация намного больше или сложнее чем требуется. Потребует кучу ресурсов на поддержку проекта.

    • Преждевременная оптимизация (aka Premature Optimization) junior

      Прибегание к оптимизации там где она не требуется на данный момент. Отнимет кучу ресурсов на этапе разработки проекта.

  8. Приёмы рефакторинга

    Чтобы избавляться от тех.долга придётся часто и много рефакторить.

  9. Антипаттерны

    Полезно знать как следует делать, но не менее полезно знать как НЕ следует делать.

  10. Semver

    Самый распространённый принцип наименования версий приложения. В некоторых языках и пакетных менеджерах является обязательным к соблюдению.

  11. Распределенные системы

    Когда приложение упирается в потолок сервера то у вас только один выход - заставить приложение работать на нескольких серверах. Это сильно усложняет приложение и много ресурсов уходит на сохранение целостности и согласованности данных.