Skip to content

Latest commit

 

History

History
712 lines (665 loc) · 78 KB

README.md

File metadata and controls

712 lines (665 loc) · 78 KB

Oh My BackEnd

Что это? Этот документ содержит список (roadmap) навыков, которые часто требуются backend разработчику web-приложений. Документ разделён на этапы (темы), каждый этап разделён на пункты. Каждый пункт, в документе, подразумевает что:

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

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

Как работать с документом? Этапы и пункты выстроены в рекомендуемом порядке для изучения. Просто следуйте сверху-вниз.

Как работать с пунктами документа? Каждый пункт легко гуглится и имеет страницу в wikipedia. Ссылки устанавливаются если есть альтернативная документация — более понятная и/или более подробная. Ссылка на вики ставятся что бы исключить ошибочного варианта статьи на вики.

Цитатой обозначены пояснения к пункту для чего следует это знать и/или где с этим можно столкнуться. Если пояснения нет — то либо не успели сделать, либо там и так ясно.

Есть-ли разделение по скилам? Каждый пункт делится на градации junior, middle, middle+ (он же high middle). Градация используются что бы помочь разделить кучу тем на то что стоит изучать в первую очередь. Тут применяется общепринятая градация навыков и зон ответственности, где senior это middle+ с soft-скилами. Поэтому тут будет максимум middle+, так как документ про hard-скилы.

Метка guru ⚡ означает что этот пункт для более глубокого и продвинутого изучения темы (если у Вас есть время).

В каком состоянии документ? Документ еще находится в процессе дополнения. В идеале каждый пункт должен иметь градацию, иметь пояснение и иметь ссылку на толковое разъяснение на русском языке. До идеала еще далеко, но начало положено!

Если хотите что-то изменить (пункт, ссылку, опечатку) — создавайте issue или делайте pr. Если хотите обсудить документ — создавайте обсуждение в discussions.

Содержание

Этап 1. Виртуализация docker

Для начала надо поднять виртуальную машину для экспериментов и исследований. Даже если уже имеете Linux на рабочей машине, всё равно поднимите виртуализацию. В случае чего, виртуальную машину всегда можно пересоздать. Есть много систем виртуализаций, но docker выделяется среди них. Docker - популярный инструмент для десктопной виртуализации, на серверах к нему прибегают в меньшей стемени, так как там больше популярен Kubernetes (aka k8s).

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

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

Этап 2. Linux

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

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

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

  2. Базовые навыки в bash (улучшенный sh aka shell). 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). 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

      Редакторы избыточны, что бы просто посмотреть содержимое файла. Просмотрщики так же справляется с не "стандартными" для редакторов файлами.

    • Фоновые задачи, оператор &, команды 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
    • Супер пользователь, команды 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 ⚡
      • Флаги 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 ⚡
  2. Проблемы сети. junior

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

    • Packet loss junior
    • Reordering middle
    • Jitter middle
    • Round-Trip Time (RTT aka лаг) junior
  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
  5. Трассировки маршрутов. middle
  6. Анализ трафика через tcpdump + wireshark guru ⚡

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

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

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

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

  1. 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
    • Анализ выполнения запросов через 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

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

  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/1.0, HTTP/1.1 middle

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

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

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

  11. HTTP/2.0 протокол и HTTP/3.0 middle+
  12. WebSocket протокол middle

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

  13. WebRTC guru ⚡

    Если надо будет организовывать p2p чаты или p2p стриминг, то WebRTC как раз для этого.

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

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

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

  1. Виды управления доступом middle
  2. Аутентификация junior
    • Basic junior

      Самый простой вид авторизации, не требующий дополнительных вычислительных мощностей (серверов).

    • OAuth2 middle

      Распространенный вид авторизации через посредника, который гарантирует что Вы это Вы и может выдать некоторые данные по пользователю, с его согласия. Часто сталкиваются c OAuth2 тогда когда надо подключить авторизацию через соц. сети. У них у всех 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
    • Примитивные типы данных

      Базовые скалярные типы — целые числа, строки, 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)
  3. Распараллеливание 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

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

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

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

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

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

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

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

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

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

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

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

  1. Спецификация письма MIME middle
    • Основные заголовки: Return-Path, Received, From, To, Cc, Bcc, Reply-To, Subject, Message-ID middle
    • прочие заголовки middle+
    • указание кодировки middle
    • кодирование полей и тела в base64 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. Работа с nested-документами middle
  7. 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.

  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+
    • Шаблон MVC junior

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

    • Шаблон 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

    • SPA (Single Page Application)

    Общее название подхода когда приложение живёт в браузере и ходит за данными на сервер. Может быть как SSG, SSR, SSR или любое их сочетание.

    • SSG (Static Site Generation)

      Все страницы приложения заранее генерируются в статичные файлы. Динамика полностью на JS.

    • SSR (Server Side Rendering)

      Типовой вид приложения. Каждый запрос обрабатывается на сервере, где ответ - UI.

    • CSR (Client Side Rendering)

      Весь UI отрисовывается в браузере при помощи JS. JS делает запросы на сервера за данными, для отрисовки.

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

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

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

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

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

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

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

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

  9. Semver

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

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

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