Что нужно знать бэкенд-разработчику web-приложений. Backend Roadmap (from Junior to Senior).
Что это? Этот документ содержит список (roadmap) навыков, которые часто требуются backend разработчику web-приложений. Документ разделён на этапы (темы). Каждый этап разделён на пункты. Каждый пункт, в документе, подразумевает что:
Понимание принципа работы каждого пункта будет дополнительным бонусом в понимании всей темы, но это может занять много времени. Изучайте по желанию и необходимости.
Как работать с документом? Этапы и пункты выстроены в рекомендуемом порядке для изучения. Просто следуйте сверху-вниз.
Как работать с пунктами документа? Каждый пункт легко гуглится и имеет страницу в wikipedia. Ссылки устанавливаются если есть альтернативная документация — более понятная и/или более подробная. Некоторые ссылки могут потребовать наличия VPN. Ссылка на wikipedia ставятся для уточнения если название статьи неочевидно или можно перепутать статьи.
Цитатой обозначены пояснения к пункту для чего следует это знать и/или где с этим можно столкнуться. Если пояснения нет — то либо не успели сделать, либо там и так ясно.
Есть ли разделение по скилам? Каждый пункт делится на градации junior, middle, middle+ (он же high middle). Градации используются чтобы помочь выставить приоритеты в различных темах — на то что стоит изучать в первую очередь. Тут применяется общепринятая градация навыков и зон ответственности, где senior это middle+ с soft-скилами. В данном документе максимальным уровнем градации будет — middle+, так как этот документ акцентирует внимание на hard-скилах.
Метка guru ⚡ означает что этот пункт для более глубокого и продвинутого изучения темы (если у Вас есть время).
В каком состоянии документ? Документ еще находится в процессе дополнений и правок. В идеале каждый пункт должен иметь градацию, иметь пояснение и ссылку на толковое разъяснение на русском языке. До идеала еще далеко, но начало положено!
Если хотите что-то изменить (пункт, ссылку, опечатку) — создавайте issue или делайте pr. Если хотите обсудить документ — создавайте обсуждение в discussions.
Для начала надо поднять виртуальную машину для экспериментов и исследований. В случае чего, виртуальную машину всегда можно пересоздать.
Есть много систем виртуализации, но docker выделяется среди них. Docker — популярный инструмент для десктопной виртуализации. На боевых серверах к нему прибегают в меньшей степени, так как там более популярен Kubernetes (aka k8s). Docker не единственная система виртуализации, ближайшие аналоги это Lima, Podman (нечто среднее между docker
и k8s
).
Для рабочего приложения, как правило, требуется несколько различных сервисов (база данных, кэшер, http-сервер и т.д.) и всё это упаковать в один docker контейнер будет проблемно, просто из-за специфики работы самой виртуализации. Тут как раз поможет compose чтобы запустить кучу контейнеров и подружить их между собой.
Изучить установленный в контейнере — Linux. Linux, де-факто, является серверной ОС для большинства web-приложений. В этом разделе будет говориться о Linux, хотя (почти) всё так же актуально и для других posix-совместимых систем. Например для bsd семейства, включая MacOS. Однако, могут быть отличия. В качестве стартового дистрибутива Linux, обычно, выбирают Ubuntu, но вы можете взять самый компактный - Alpine, который часто используется в виртуализации.
apt
/apt-get
в Ubuntu/Debian и apk
в Alpine. junior
В процессе исследований и различных проб придётся много раз ставить, обновлять и переустанавливать множество пакетов Linux. Лучше сразу изучить как работают эти команды. Нужны базовые операции: найти, установить, обновить, удалить.
bash
(улучшенный sh
aka shell
). junior
В Linux-подобных системах bash'ем пронизано всё. Вы гарантировано столкнётесь с ним и будут случаи когда надо будет писать bash/shell скрипты.
По факту это единственный скриптовый язык который гарантированно будет установлен в системе.
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: esc, напечатайте
:q!
, enter.
less
, zless
. Открыть, найти слово, закрыть. junior
Редакторы избыточны, чтобы просто посмотреть содержимое файла. Просмотрщики так же справляются с не "стандартными" для редакторов файлами.
mc
. junior
Консольные файловые менеджеры, наподобие Midnight Commander, предоставляют UI, который делает более удобной и наглядной работу с типовыми файловыми операциями.
&
, команды jobs
, fg
, bg
. middle
Оператор позволит в одной shell-сессии запускать несколько команд.
nohup
. middle
Команда позволит, при завершении shell-сессии, оставлять в живых запущенные фоновые задачи до их логического завершения.
>
, >>
, <
. junior
Куда писать вывод, а куда ошибки, помогут указать эти операции.
процесс
. junior
Как и во всех других ОС, в Linux запущенные приложения представляются процессами.
top
, htop
, ps
(ps aux
). junior
Этакий "диспетчер задач" в мире Linux, позволяющий мониторить процессы системы.
Процессы не появляются из ниоткуда, их что-то запускает. Понимание иерархии процессов облегчит работу с ними и сделает проще понимание мультипроцессовых приложений.
Это один из распространённых видов распараллеливания вычислений в приложениях. Много программ используют именно такой подход распараллеливания.
Это вид проблемы распараллеливания вычислений через дочерние процессы. Возникает когда у мастер-процесса есть проблемы или баги.
Это основной рычаг воздействия на процессы сторонними приложениями (системными или вашими).
Системный вызов (вызов API ядра Linux) — не бесплатная операция и лучше их держать под контролем на высоконагруженных приложениях.
strace
. middle+
Самый простой и доступный способ посмотреть какие системные вызовы делает процесс в реальном времени.
дескриптор
. middle
Любой поток данных (входящий и/или исходящий) представляется в виде дескрипторов. Что-либо читать или писать будете (вероятней всего) через дескриптор.
STDIN
, STDOUT
, STDERR
и их нумерация. middle
Любой поток в процессе пронумерован и есть "зарезервированные" номера под определенные потоки.
Это всё разновидности дескрипторов с которыми придётся работать. На всех них распространяются правила дескрипторов, ну так как они и есть дескрипторы.
Не редкая проблема приложений когда оно упирается в лимит открытых дескрипторов.
lsof
. middle+
Для отладки приложения всегда надо знать с чем ведёт общение приложение (отлично работает в паре с
strace
, сопоставляя номера дескрипторов).
root
. junior
По сути это админ системы. Избегайте использование root (даже в контейнерах) так как доступ к root даёт доступ ко всей системе, о чем мечтают все зловреды.
Никто не даст вам root на проде, но вполне можете иметь "привилегированного" пользователя, который умеет в
sudo
.
stat
junior
Избыточные доступы ведут к дыре в безопасности, недостаток доступов ведёт к багам в приложении. Осмысленно ставьте где
x
(особенно у директорий), гдеr
, а гдеw
.
--xr-xrwx
и 0137
(восьмеричная) у файлов и директорий. junior
Обычно в таком виде вы будете видеть уровни доступов в консолях.
chmod
, chown
. middle
Нужно знать где, как и куда примонтированы различные диски или носители. Бывает, что приложение может работать сразу с несколькими дисками, некоторые могут быть сетевыми.
Самый распространённый вид ссылки. Повсеместно используется в Linux да и пакетных менеджерах разных языков. Вы тоже будете это использовать.
Редкий случай использования ссылки. Потребуется если надо "дедуплицировать" большой объём файлов. По сути позволяет создать несколько имён одному файлу.
Linux по сути просто пачка запущенных приложений как сервисов.
Самый доступный способ запустить
shell
на удалённой машине это использовать SSH. Используется повсеместно.
ssh-keygen
. junior
Без него вы не попадёте на хосты по SSH.
Появляется потребность перекинуть логи, дамп базы и другие файлы между машинами или к себе.
scp
junior
самый простой инструмент переноса файлов между хостами по ssh.
rsync
middle
пожалуй самый мощный инструмент переноса файлов между хостами с кучами настроек, правил и протоколов.
rclone
middle
"rsync" для облачных хранилищ. Универсальный инструмент для работы с контентом, который хранится в облаках или где-то по сети.
crontab
и запуск crond
.
Самый распространённый и простой планировщик задач, с весьма гибкими настройками расписания
at
middle
Когда хотите запустить задачу разово, к определенному времени. В crontab это потребует отдельно создавать расписание, что сильно затрудняет автоматику и захламляет всё расписание.
free
, мета информация /proc/meminfo
. middle
Всегда оценивайте сколько памяти потребуется приложению или скриптам, чтобы не быть убитыми системой.
Out Of Memory
(OOM) и причина появления. OOM-киллер. middle+
Именно это происходит когда вы превысили все допустимые пределы потребления памяти в системе.
Когда случаются проблемы то логи — единственное, что может навести на суть проблемы. Помимо логов приложения стоит заглядывать в логи системы, иногда её проблема может вести к проблеме в приложениях. Стоит выделить некоторые логи:
dmesg
(driver messages) — важные сообщения от компонентов Linux, включая от OOM-киллера. middle
syslog
— системный журнал. middle
Там могут быть сообщения от ядра Linux, различных служб, сетевых интерфейсов и многого другого.
Их много, но выделим только несколько.
BSoD аналог для Linux. Самая не приятная ошибка системы, явно намекающая, что система не стабильна.
Не такая уж и редкая ошибка приложений, как хотелось бы. Приложение попыталось работать с памятью доступа к которой у неё нет.
Результат обработки segmentation fault системой. Корка может потребоваться разработчику упавшего приложения для анализа состояния программы на момент падения.
Некоторые пункты сложно категоризировать в этом документе. Но без них не обойтись. Это базовые вещи которые используются повсеместно в коде, в системах, "под капотом" вашего языка программирования.
Рано или поздно придётся спарсить данные из текста или проверять данные, вот тут как раз и потребуются регулярные выражения.
Не пугайтесь. Пункт подразумевает прикладное применение криптографических функций (для чего нужны те или иные функции), а не изучении самой криптографии.
crc32
, md5
, sha1
, sha256
. junior
Чтобы обезопасить от подделки данных используются цифровые подписи этих же данных.
В теории (да и на практике) хеш-функцию можно определить и чтобы сильнее обезопасить от "взлома" вашего хеша, используя так называемую соль.
Хеш-функции могут на разных данных вернуть один и тот же результат (хеш), что может привести к проблемам и багам. Лучше знать какова вероятность коллизий у хеш-функции и как их избегать.
Иногда приходится шифровать данные и важно выбрать стратегию шифрования.
Имеется ввиду как работаю CA корневые и промежуточные, что стоит за сертификатом.
git
. junior
По факту это дефолтная система контроля версий в мире IT.
Таблицы часто используются в самих языках программирования (ассоциативные массивы, объекты и т.п.)
Самые простые структуры данных, которые часто придётся использовать повседневно в коде.
Эти структуры данных часто используются в разработке так как являются самым простым способом связать элементы с собой. Они так же активно используются внутри вашего языка (под "капотом") повсеместно.
Текстовые форматы используются так же для хранения конфигурации приложений
Бинарные форматы используются сугубо для хранения и передачи данных.
Сеть в разработке самая важная и, часто, мало заметная часть.
Вы вряд ли будете читать пакеты TCP. Но полезно знать КАК работает TCP, это позволит понять почему при идеальных "интернетах" всё равно приложение может лагать по сети.
Вряд ли придётся работать с пакетом TCP напрямую, однако из его структуры можно подчерпнуть некоторую полезную информацию по протоколу TCP в целом.
Флаги отвечают за организацию, подтверждение передачи и закрытие TCP коннектов.
TCP очень старый протокол, который уже не удовлетворяет современным реалиям.
Самый простой сетевой протокол семейства. Требуется понимание его работы. HTTP/3.0, DNS работает на протоколе UDP, и понимание UDP даст немного понимания в работе HTTP/3.0
Изучить придётся только если потребуется создать свой протокол передачи данных взамен изжившего себя TCP.
Их, как всегда, много. Но стоит выделить те, которые явно влияют на скорость работы сети. По большей части эти проблемы присущи TCP, но могут появиться и там где эмулируют TCP — на другом протоколе (например UDP)
Базовое отличие протоколов надо знать, хотя бы, чтобы правильно создать колонку IP в базе и обработку в коде.
Ваш код 24/7 будет работать с доменами так как никто не использует чистый IP для соединения с чем-либо. Зная как работает DNS и управление резолвингом домена в системе, можно упростить отладку в некоторых случаях.
/etc/hosts
junior
Самый простой и доступный способ поменять IP любому домену, локально, конечно же.
/etc/resolv.conf
middle+
Конфигурация для системы, как и где надо резолвить домены.
whois
, dig
, host
. junior
Чтобы идентифицировать проблему с доменом нужно научиться работать с этими командами. Анализируйте домены как через дефолтный для себя DNS так и через публичные, такие как
1.1.1.1
или8.8.8.8
.
tcpdump
+ wireshark
guru ⚡
Не простой, но очень эффективный способ "увидеть" и проанализировать трафик в удобном UI.
Без баз данных — никуда. Самый частый вид баз данных — реляционные базы данных. Поэтому даже junior должен уметь работать с ними, а вот с NoSQL базами данных можно ознакомиться чуть позже.
MySQL подразумевает как MySQL от Oracle, так и различные варианты в виде MariaDB, Percona XTraDB и т.д. В общем понимании семейства: MySQL/Postgres/MSSQL/и т.д. имеют схожие SQL API, различаются только внутренней реализацией, производительностью и масштабируемостью.
SELECT
/INSERT
/UPDATE
/DELETE
. junior
EXPLAIN
, понимание результатов EXPLAIN
. junior
Самый действенный способ понять почему тормозит запрос.
Всегда будут появляться медленные запросы, и чем их больше, тем медленнее будет работать ваше приложение. И как правило у разных баз данных всегда есть аналитика для поиска "узких" мест.
Не получится сидеть всё время, мониторя все запросы. Проще настроить агрегацию медленных запросов.
В MySQL семействе это perfomance_scheme, в postgres это Statistics Collector. Поможет в полной мере понять какие запросы плохо работают, где не достаёт индексов, где их в избытке и так далее.
Индексы очень важная часть баз данных. Ваши запросы всегда должны работать "по индексам". Запрос без индекса или с "плохим" индексом, на нагруженных проектах, гарантировано может привести к падению приложения.
Это не относится к вычислительным кластерам. Это индекс данных, по нему и укладываются строки в таблице.
Индекс, уникально идентифицирующий каждую строчку в таблице. Как правило, PRIMARY индекс и есть кластерный индекс.
Условия и/или сортировки редко когда бывают по одному полю, обычно их больше. Вот тут на сцену выходят составные индексы. Тут надо понимать что в составном индексе, последовательность полей важна.
BTREE
. guru ⚡
Это понимание не сделает ваши запросы быстрее, но даст понятие как ведут себя те или иные данные в индексах.
LEFT JOIN
, RIGHT JOIN
, INNER JOIN
, OUTER JOIN
, JOIN
. junior
Данные всегда "размазаны" по таблицам. Чтобы их собрать потребуются эти операторы.
GROUP BY
. junior
Группировка данных — не редкие запросы, как правило, используются для сбора статистики.
foreign key
) middle
Нередко используют внешние ключи для поддержания консистентности данных в базе.
Чтобы провести несколько операций атомарно (как одну операцию) используются транзакции.
INSERT
/UPDATE
/DELETE
. middle
Не стоит активно использовать триггеры. Тем не менее они могут оказаться полезными в некоторых отладочных или maintenance случаях.
Не просто сохранить древовидную структуру в реляционной базе. Есть насколько алгоритмов со своими плюсами и минусами. На самом деле актуально и для других видов баз данных
Классический вариант "с parent_id" у дочерних элементов. Простые и "дешевые" на вставку элементов в деревья. Но такие деревья затратные "на сборку".
Алгоритм позволяет достаточно дёшево собирать деревья с различными модификациями и сегментами. Но затратные на вставку элементов в деревья.
Среди всех NoSQL самой популярной является MongoDB.
explain()
, понимание его результатов. middle
Универсальный инструмент хранения данных с уклоном в производительность. Может быть, как быстрым постоянным хранилищем, так и реактивным кэширующим, временным хранилищем.
Даёт возможность запустить любой набор команд атомарно, дополнительно снабдив логикой.
Каждый WEB разработчик должен понимать протокол HTTP. Разработчик который не знает HTTP протокол — это как сапожник без сапог. Поэтому даже junior должен многое знать про протокол HTTP.
В консоли можно наблюдать все HTTP-запросы со страницы и даже делать самим через функцию
fetch
.
Каждый метод имеет своё назначение (достаточно перевести названия методов) и, как следствие, имеет свои условности и ограничения.
Коды создавались и описывались не в хаотичном порядке. Есть чёткое разделение их "сфер влияния". Даже если какой-то сервер придумает свой код ответа, то по группе вы сможете лучше понять причину такого ответа.
Это наиболее частые коды ответов которые вы гарантировано встретите.
application/x-www-form-urlencoded
junior
Cache-Control
, Expires
, Vary
, ETag
, Last-Modified
.На данный момент это единственный точный способ идентифицировать пользователя.
Для кросс-доменных XHR/WebSocket запросов надо научиться работать с CORS, иначе запросы не будут работать.
Для повышения безопасности можно ограничить и указать что и откуда может загружаться и запускаться на странице.
Не смотря на появление новых версий протокола HTTP, версии HTTP/1.0 и HTTP/1.1 всё еще остаются частыми во внутренних сетях кластеров.
curl
, wget
junior
На серверах (хостах) нет браузеров, чью удобную консоль можно использовать. Там есть shell и множество утилит, которые умеют работать с HTTP.
Каждый протокол имеет свои возможности и улучшения, которые можно использовать для ускорения приложения.
Это расширения версии HTTP/1.1 и выше для механизма обмена данными по одному соединению. Часто используется для чатов и/или для event-driven модели.
Если надо будет организовывать P2P (peer-to-peer) чаты или P2P стриминг, то WebRTC как раз для этого.
Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - высока.
/etc/nginx/nginx.conf
раздачи файлов junior
Один из старых, но активно использующихся Web-серверов широкого профиля. Хоть он уже и уступает nginx-у в популярности, но столкнуться с ним в проекта есть всё так же легко.
Ваше приложение всегда под угрозой, даже если это какое-то home-page приложение. Ботнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).
Самый простой вид авторизации, не требующий дополнительных вычислительных мощностей (серверов).
Общее название подхода к авторизации: авторизация на множестве приложений через одну точку. OAuth и OpenID — частные случаи SSO.
Распространенный вид авторизации через посредника, который гарантирует что Вы это Вы и может выдать некоторые данные по пользователю, с его согласия. Часто сталкиваются c OAuth2 тогда когда надо подключить авторизацию через соц. сети. У них у всех OAuth2 (но каждый со своими модификациями).
Один из первых популярных SSO. Уступает Oauth2 по популярности, но так же где-то используется.
Данный вид авторизации используется, чаще всего, для авторизации во внутренних сервисах своих сотрудников.
Это не тип авторизации, а инструмент для передачи идентифицирующих данных. Однако такой токен может иметь очень широкое применение, не только в авторизации.
Языков программирования много. Однако, они имеют много общего между собой, кто-то больше, а кто-то меньше. Этот этап будет задевать только часто встречающиеся пункты в большинстве популярных языков программирования. Этап не будет чётко дробиться на градации, так как многое зависит от самого языка, его возможностей и его расширений.
Принцип работы с этим разделом: ищите %ваш_язык_программирования% %пункт_из_этапа%
.
Учтите, что некоторых пунктов может не быть в вашем языке.
Базовые скалярные типы — целые числа, строки, булевы значения, числа с плавающей точкой, null/nil и так далее.
Умение определить простую функцию и вызвать её. Бывают языки где функций без объектов не может быть
В языке программа может запускаться только через стартовую функцию, например
main()
. Но некоторые языки позволяют запустить файл с кодом.
Представляет собой различные комбинации примитивных типов. Например числовой массив данных можно сделать почти в любом языке.
Все современные языки имеют объекты и умеют ими оперировать.
Позволяет объектам самим определять как над ними производить математические, логические и прочие действия (операции).
Позволяет определить несколько методов с одним названием, но с разной сигнатурой. Как правило это достигается за счет различного набора параметров (количества или типов принимаемых значений) для каждого метода.
Специфичная возможность некоторых языков программирования со строгой типизацией. Позволяет определить единую сигнатуру для обработки различных типов.
Важно понимать когда ваши переменные доступны в коде, а где уже/ещё нет. Особенно важно это понимать когда работаете с ссылками.
Много языков высокого (и не только) уровня имеют GC. GC отвечает за освобождение памяти от мусора (забытые данные, данные которые уже не нужны коду) в процессе работы кода. Это очень важная часть вашего языка, так как пока работает GC — не работает ваш код. А если GC будет часто и/или много работать то ваше приложение начнет лагать и "зависать".
Сильная типизация требует явного указания в коде типа данных, которые будут использоваться в переменной, аргументе и т.д. А динамическая, наоборот, позволяет не указывать тип. Вычисление типа значения будет происходить динамически, в момент выполнения программы/программного кода (runtime). Некоторые языки могут поддерживать одновременно как строгую так и слабую типизации.
not
, and
, or
, xor
, сдвиг влево, сдвиг вправо junior
Часто вместо
or
иand
используются символы|
/||
и&
/&&
. С битовыми операциями можно столкнуться чаще чем кажется, много функций/методов принимают опции в виде битовых флагов видаREAD|WRITE|CREATE
. Нужно уметь комбинировать битовые флаги, удалять, определять какие флаги установлены.
Вычислять в один поток, используя 1 CPU, неимоверно удобно и просто. Однако в этом случае вы ограничены скоростью 1 CPU, что может занять много времени. Для ускорения сложных вычислений или действий использоют несколько CPU одной или нескольких машин. Но это будет "стоить" не дёшево.
В отличии от процессов, потоки имеют общую память, как следствие, всегда единую кодовую базу.
Ведут себя как истинные потоки, но таковыми не являются, так как только эмулируют распараллеливание.
Вариант распараллеливания, когда один код приложения, ожидающий событие системы, уступает CPU другому коду приложения. Выполняются-ли они параллельно - зависит от реализации.
Как только у вас что-то может пойти параллельно у вас сразу же появится вероятность получить проблему RACE. На устранение или недопущение RACE всегда расходуются вычислительные ресурсы. И проблему RACE всегда сложно диагностировать. Поэтому параллелят вычисления только там где это остро необходимо.
Как и в базах данных случается так что два или более параллельных вычисления ждут друг друга. И не дождутся.
При работе в потоках, для избежания Race, языки реализовывают атомарные операция, позволяющие безопасно менять значения переменным.
Чтобы избегать Race нужно использовать блокировки.
По сути это атомарная блокировка.
Упрощенный вид mutex
Высокоуровневые языки, обычно, расширяются модулями, написанными на низкоуровневом языке, на котором написан сам обработчик языка.
Большую часть времени вы будете не писать новый код, а производить отладку уже написанного кода. В некоторых языках отладчик уже "встроен в язык", но некоторые языки требуют дополнительные модули или инструменты для этого.
Некоторые языки в коде запускают сервера, а некоторые имеют отдельный сервер который запускает код. Может быть и то и то.
Генерировать UI через
Ознакомление с системой тестирования в вашем языке. Подбор пакета/модуля для тестирования.
Работа с email, неотъемлемая часть web-разработки (да и не только). По факту, это единственный гарантированный канал связи с пользователем.
Return-Path
, Received
, From
, To
, Cc
, Bcc
, Reply-To
, Subject
, Message-ID
junior
Это почтовый сервер для тестирования работы отправки писем приложениями, который можно поднять локально в контейнере.
Каждый разработчик сталкивается с необходимостью полнотекстового поиска, да и в целом быстрого поиска по куче атрибутов и текстов. Для этого используются различные полнотекстовые поисковые движки такие как ElasticSearch, SphinxSearch, ManticoreSearch, MeiliSearch и т.д. Самый распространенный полнотекстовый поисковый движок с большим сообществом — ElasticSearch.
Запросы на изменение лучше делать пачкой, так называемым bulk-ом.
потребуется чтобы точечно обновить некоторые поля у документа или вложенные документы, вместо всего документа
Основную работу по индексации и поиску выполняют Lucene-индексы. Сам ElasticSearch — кластер с HTTP-сервером, гарантирующий сохранность Lucene-индексов и отвечающий за их репликацию и шардирование. Если вам нужно чтобы была быстрая индексация и/или быстрый поиск то вам надо тюнить работу Lucene-индексов.
Метрики позволят узнать о проблеме, а логи позволят понять причину проблемы. Для крупных и/или распределённых систем этот тандем обязателен. Для обработки большого объёма данных нужны подходящие системы для сбора, хранения и агрегации. Любое приложение должно уметь генерировать полезные метрики для системы сбора и анализа метрик. И писать правильные системные логи о своих событиях. Логи о событиях пользователей уже относятся к аудиту, а не к системным логам.
Их на самом деле много, но среди бесплатных opensource, по популярности выделяются несколько
Не самая тривиальная, но эффективная для приёма, обработки, хранения и работы с логами. ELK: Logstash - парсит логи, ElasticSearch - хранит логи, Kibana - UI для ElasticSearch для работы с логами.
Колоночная база данных, которая отлично справляется с большим количеством логов (и не только access). Если проводить аналогию с ELK то: MaterializedView - позволяет парсить (структурированные) логи, семейство MergeTree — хранит логи. А вот UI только сторонний брать, например Grafana или Kibana.
База данных для логов на базе Prometheus-like хранилищах с хорошей интеграцией с Grafana.
Популярная система сбора и хранения метрик.
Отличный UI для отображения метрик из разных систем хранения, включая Prometheus-like системы.
Паттерны, концепции и подходы к проектированию различных web-приложений.
В одном проекте может быть один или несколько архитектурных шаблонов, или даже половина. Архитектурные шаблоны - подход к решению задачи, которую возложили на проект.
Самый старый и достаточно распространённый шаблон проектирования приложения, разделяющий UI от логики приложения.
Доработка MVC под задачи веба
MVP - итерация развития MVC из-за усложнений приложений и UI. Часто используется во front-end - в браузере.
На самом деле этот шаблон подходит для десктопных или мобильных приложений. В web приложениях практически не используется.
Шаблоны упрощают разработку, так как это, по сути, опыт сообщества по решению тех или иных проблем. Главное не забывайте про KISS и YAGNI, чтобы не упасть в ад абстракций и пучину сложности.
Это не про scrum, agile, waterfall, планирование, проектирование и прочее. Это про методологии написания кода.
Разработка через тестирование, самый известный способ разработки, требующий от разработчика сначала - написание теста к коду, а потом самого кода.
Расширенная версия TDD, тем что сперва пишется не тест, а описание что нужно сделать, на предметном языке, например Gherken.
Существует разделение приложения по способу генерации UI.
Классический тип приложения, с несколькими страницами генерируемыми на back-end для создания UI.
Общее название типа приложения когда приложение живёт в браузере и ходит за данными на сервер. Может быть как SSG, SSR, CSR или любое их сочетание.
Все страницы приложения заранее генерируются в статичные файлы. Динамика полностью на JS. Может быть как и MPA так и SPA.
Подход к генерации страниц приложения. Каждый запрос обрабатывается на сервере, где генерируется UI, а после сервер возвращает ответ клиенту на front-end.
Подход к генерации страниц приложения. Весь UI генерируется в браузере при помощи JS. JS делает запросы на сервера за данными, для построения или изменения UI. SPA — частный случай CSR.
Буквально ваш сайт в виде мобильного приложения.
Тестирование отдельных (в том числе отдельных друг от друга) частей продукта, обычно отдельных функций/методов. Unit-тесты так же несут ещё одну цель - проверка архитектуры вашей реализации. Как правило, если у вас не получается написать unit-тест на функцию/метод, не вовлекая сторонние компоненты приложения то возможно стоит пересмотреть архитектуру. Хорошее Unit-тестирование ведёт к хорошей инверсии контроля (IoC, см. выше)
Сложный вид тестов. Проверка работоспособности приложения, модуля, компонентом с другим приложением, модулем, компонентом.
Пример E2E теста - тестирование готового API приложения. Тестируются не компоненты приложения, а готовая функциональность.
Дымовые тесты позволяют протестировать саму возможность работать вашему приложению. Иногда используют для тестирования инфраструктуры на возможность работать в ней вашему приложению.
Тех.долг начнёт копиться в проекте с первых строк кода. Всегда стоит его учитывать в разработке и планировать его устранение.
Когда реализация намного больше или сложнее чем требуется. Потребует кучу ресурсов на поддержку проекта.
Прибегание к оптимизации там где она не требуется на данный момент. Отнимет кучу ресурсов на этапе разработки проекта.
Чтобы избавляться от тех.долга придётся часто и много рефакторить.
Полезно знать как следует делать, но не менее полезно знать как НЕ следует делать.
Самый распространённый принцип наименования версий приложения. В некоторых языках и пакетных менеджерах является обязательным к соблюдению.
Когда приложение упирается в потолок сервера то у вас только один выход - заставить приложение работать на нескольких серверах. Это сильно усложняет приложение и много ресурсов уходит на сохранение целостности и согласованности данных.
В распределённых системах придётся чем-то жертвовать. PACELC - расширенная теорема CAP. Эти теоремы как раз описывают какими параметрами придётся пожертвовать системе.