{"id":13639344,"url":"https://github.com/bzick/oh-my-backend","last_synced_at":"2025-05-14T19:08:14.122Z","repository":{"id":37570461,"uuid":"230149462","full_name":"bzick/oh-my-backend","owner":"bzick","description":"Что нужно знать бэкенд-разработчику web-приложений. Backend Roadmap (from Junior to Senior).","archived":false,"fork":false,"pushed_at":"2025-01-17T10:36:17.000Z","size":254,"stargazers_count":1473,"open_issues_count":0,"forks_count":115,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-05-14T19:08:12.132Z","etag":null,"topics":["backend","backend-roadmap","junior","learning","middle","oh-my-backend","roadmap","senior","technology"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bzick.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-25T20:19:00.000Z","updated_at":"2025-05-14T14:44:45.000Z","dependencies_parsed_at":"2025-01-28T03:38:14.334Z","dependency_job_id":null,"html_url":"https://github.com/bzick/oh-my-backend","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzick%2Foh-my-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzick%2Foh-my-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzick%2Foh-my-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bzick%2Foh-my-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bzick","download_url":"https://codeload.github.com/bzick/oh-my-backend/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254209859,"owners_count":22032897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","backend-roadmap","junior","learning","middle","oh-my-backend","roadmap","senior","technology"],"created_at":"2024-08-02T01:00:59.768Z","updated_at":"2025-05-14T19:08:13.325Z","avatar_url":"https://github.com/bzick.png","language":null,"funding_links":[],"categories":["Common backend","Содержание:"],"sub_categories":["Полнотекстовый поиск"],"readme":"Oh My BackEnd\n=============\n\n**Что это?** Этот документ содержит список (roadmap) навыков, которые **часто** требуются backend разработчику web-приложений. Документ разделён на этапы (темы). Каждый этап разделён на пункты. Каждый пункт, в документе, подразумевает что:\n- бекендер знает что это и какую проблему решает.\n- бекендер знает для чего и когда следует применить.\n- бекендер знает как с этим работать или знает где подсмотреть.\n- при разработке или проектировании бекендер помнит про них и учитывает в приложении.\n\nПонимание принципа работы каждого пункта будет дополнительным бонусом в понимании всей темы, но это может занять много времени. Изучайте по желанию и необходимости.\n\n**Как работать с документом?** Этапы и пункты выстроены в рекомендуемом порядке для изучения. Просто следуйте сверху-вниз.\n\n**Как работать с пунктами документа?** Каждый пункт легко гуглится и имеет страницу в wikipedia. \nСсылки устанавливаются если есть альтернативная документация — более понятная и/или более подробная. Некоторые ссылки могут потребовать наличия VPN.\nСсылка на wikipedia ставятся для уточнения если название статьи неочевидно или можно перепутать статьи.\n\u003e Цитатой обозначены пояснения к пункту для чего следует это знать и/или где с этим можно столкнуться. \n\u003e Если пояснения нет — то либо не успели сделать, либо там и так ясно.\n\n**Есть ли разделение по скилам?** Каждый пункт делится на градации \u003ckbd\u003ejunior\u003c/kbd\u003e, \u003ckbd\u003emiddle\u003c/kbd\u003e, \u003ckbd\u003emiddle+\u003c/kbd\u003e (он же \u003ckbd\u003ehigh middle\u003c/kbd\u003e). \nГрадации используются чтобы помочь выставить приоритеты в различных темах — на то что стоит изучать в первую очередь. \nТут применяется [общепринятая градация](https://vas3k.ru/blog/team/) навыков и зон ответственности, где \u003ckbd\u003esenior\u003c/kbd\u003e это \u003ckbd\u003emiddle+\u003c/kbd\u003e с soft-скилами.\nВ данном документе максимальным уровнем градации будет — \u003ckbd\u003emiddle+\u003c/kbd\u003e, так как этот документ акцентирует внимание на hard-скилах.\n\nМетка \u003ckbd\u003eguru ⚡\u003c/kbd\u003e означает что этот пункт для более глубокого и продвинутого изучения темы (если у Вас есть время).\n\n**В каком состоянии документ?** Документ еще находится в процессе дополнений и правок. \nВ идеале каждый пункт должен иметь градацию, иметь пояснение и ссылку на толковое разъяснение на русском языке. \nДо идеала еще далеко, но начало положено!\n\nЕсли хотите что-то изменить (пункт, ссылку, опечатку) — создавайте [issue](https://github.com/bzick/oh-my-backend/issues) или делайте [pr](https://github.com/bzick/oh-my-backend/pulls). \nЕсли хотите обсудить документ — создавайте обсуждение в [discussions](https://github.com/bzick/oh-my-backend/discussions).\n\n# Содержание\n\n- [Этап 1. Виртуализация docker](#этап-1-виртуализация-docker)\n- [Этап 2. Linux](#этап-2-linux)\n- [Этап 3. Общие знания](#этап-3-общие-знания)\n- [Этап 4. Сеть](#этап-4-сеть)\n- [Этап 5. Базы данных](#этап-5-базы-данных)\n- [Этап 6. Протокол HTTP](#этап-6-протокол-http)\n- [Этап 7. Безопасность](#этап-7-безопасность)\n- [Этап 8. Тут должен быть ваш язык программирования](#этап-8-тут-должен-быть-ваш-язык-программирования)\n- [Этап 9. Электронная почта](#этап-9-электронная-почта)\n- [Этап 10. Полнотекстовый поиск](#этап-10-полнотекстовый-поиск)\n- [Этап 11. Логи и метрики](#этап-11-логи-и-метрики)\n- [Этап 12. Проектирование и разработка](#этап-12-проектирование-и-разработка)\n\n# Этап 1. Виртуализация docker\n\nДля начала надо поднять виртуальную машину для экспериментов и исследований. В случае чего, виртуальную машину всегда можно пересоздать.\n\nЕсть много систем виртуализации, но docker выделяется среди них. Docker — популярный инструмент для десктопной виртуализации. На боевых серверах к нему прибегают в меньшей степени, так как там более популярен Kubernetes (aka k8s). Docker не единственная система виртуализации, ближайшие аналоги это [Lima](https://github.com/lima-vm/lima), [Podman](https://podman.io/) (нечто среднее между `docker` и `k8s`).\n\n1. установить [docker](https://www.docker.com/products/docker-desktop) \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. запустить контейнер с Linux Ubuntu, последней [LTS версией](https://ru.wikipedia.org/wiki/Список_версий_Ubuntu#Выпуски). Запустить bash (консоль) контейнера. \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. установить удобное приложение для управления образами и контейнерами [Kitematic](https://kitematic.com/), [Portainer](https://hub.docker.com/r/portainer/portainer/) и т.д. \n   Либо сродниться с консольными командами docker. docker-desktop уже имеет [свой dashboard](https://docs.docker.com/desktop/dashboard/) для управления образами и контейнерами. \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. [docker compose](https://docs.docker.com/compose/) для поднятия кластера контейнеров. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Для рабочего приложения, как правило, требуется несколько различных сервисов (база данных, кэшер, http-сервер и т.д.)\n   \u003e и всё это упаковать в один docker контейнер будет проблемно, просто из-за специфики работы самой виртуализации.\n   \u003e Тут как раз поможет compose чтобы запустить кучу контейнеров и подружить их между собой.\n\n# Этап 2. Linux\n\nИзучить установленный в контейнере — Linux. Linux, де-факто, является серверной ОС для большинства web-приложений. \nВ этом разделе будет говориться о Linux, хотя (почти) всё так же актуально и для других posix-совместимых систем. Например для [bsd семейства](https://ru.wikipedia.org/wiki/BSD), включая MacOS. Однако, могут быть отличия. \nВ качестве стартового дистрибутива Linux, обычно, выбирают [Ubuntu](https://ru.wikipedia.org/wiki/Ubuntu), но вы можете взять самый компактный - [Alpine](https://ru.wikipedia.org/wiki/Alpine_Linux), который часто используется в виртуализации.\n\n1. Установка пакетов и обновление системы через `apt`/`apt-get` в Ubuntu/Debian и `apk` в Alpine. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e В процессе исследований и различных проб придётся много раз ставить, обновлять и переустанавливать множество пакетов Linux.\n   \u003e Лучше сразу изучить как работают эти команды. Нужны базовые операции: найти, установить, обновить, удалить.\n1. Базовые навыки в `bash` (улучшенный `sh` aka `shell`). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e В Linux-подобных системах bash'ем пронизано всё. Вы гарантировано столкнётесь с ним и будут случаи когда надо будет писать bash/shell скрипты.\n   * Базовый синтаксис bash. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e По факту это единственный скриптовый язык который гарантированно будет установлен в системе.\n     * Управляющие операторы `if`, `for` и `while`\n     * Логические операторы `;`, `\u0026\u0026`, `||`\n     * Исполняющие выражения `` `cmd` `` и `$(cmd)`\n   * Базовые команды для работы с файловой системой `cd`, `ls`, `find`, `cat`, `cp`, `mv`, `mkdir`, `rmdir`, `rm`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Вызов мануалов через команду `man`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Через эту команду можно получить справку по любой команде, операции, файлам и даже исходному коду.\n   * Конвейеры команд через оператор `|` (`cmd1 | cmd2 | cmd3`). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Linux имеет большое количество команд для обработки данных и для решения различных задач которые вам может понадобится объединять через конвейеры.\n   * Команды обработки данных `cat`, `tail`, `head`, `grep`, `awk`, `sed`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Этот набор потребуется для сканирования и анализа логов или больших объёмов текстовых данных.\n   * Команды работы с архивами данных `zcat`, `gzip`, `gunzip`, `tar`, `zgrep`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Как правило, никто не хранит логи или большие объёмы текстовых данных \"как есть\", обычно это архив `gz` или `tar.gz` (`tgz`).\n   * [Консольные редакторы vim, nano.](https://basis.gnulinux.pro/ru/latest/basis/10/10._Текстовые_редакторы_nano_и_vi.html) Открыть файл, внести изменения, сохранить. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Редактирование файла из консоли не такая редкость. Кстати, чтобы выйти из vim: esc, напечатайте `:q!`, enter.\n   * Консольные просмотрщики `less`, `zless`. Открыть, найти слово, закрыть. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Редакторы избыточны, чтобы просто посмотреть содержимое файла. Просмотрщики так же справляются с не \"стандартными\" для редакторов файлами.\n   * Консольный файловый менеджер `mc`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Консольные файловые менеджеры, наподобие [Midnight Commander](https://midnight-commander.org), предоставляют UI, который делает более удобной и наглядной работу с типовыми файловыми операциями.\n   * Фоновые задачи, оператор `\u0026`, команды `jobs`, `fg`, `bg`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Оператор позволит в одной shell-сессии запускать несколько команд.\n   * Команда игнорирования сигналов прерываний `nohup`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Команда позволит, при завершении shell-сессии, оставлять в живых запущенные фоновые задачи до их логического завершения.\n   * [Потоки, перенаправление потоков](http://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/11.%20Стандартные%20потоки.md), операторы `\u003e`, `\u003e\u003e`, `\u003c`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Куда писать вывод, а куда ошибки, помогут указать эти операции.\n   * [Упороться полностью консолью](https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md) \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n1. Понятие `процесс`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Как и во всех других ОС, в Linux запущенные приложения представляются процессами.\n   * Команды анализа процессов `top`, `htop`, `ps` (`ps aux`). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Этакий \"диспетчер задач\" в мире Linux, позволяющий мониторить процессы системы.\n   * Родительский процесс, дочерний процесс. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Процессы не появляются из ниоткуда, их что-то запускает. Понимание иерархии процессов облегчит работу с ними и сделает проще понимание мультипроцессовых приложений.\n   * Мастер-воркер процессы, демон (daemon). \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Это один из распространённых видов распараллеливания вычислений в приложениях. Много программ используют именно такой подход распараллеливания.\n   * Зомби-процессы. Откуда берутся и как с ними бороться. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Это вид проблемы распараллеливания вычислений через дочерние процессы. Возникает когда у мастер-процесса есть проблемы или баги.\n   * [Отправка сигналов процессам](https://ru.wikipedia.org/wiki/Сигнал_(Unix)). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Это основной рычаг воздействия на процессы сторонними приложениями (системными или вашими).\n       * Изучение команд `kill`, `pkill`, `killall`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       * Назначение сигналов [SIGKILL](https://ru.wikipedia.org/wiki/SIGKILL), [SIGTERM](https://ru.wikipedia.org/wiki/SIGTERM), [SIGINT](https://ru.wikipedia.org/wiki/SIGINT), [SIGHUP](https://ru.wikipedia.org/wiki/SIGHUP), [SIGSEGV](https://ru.wikipedia.org/wiki/SIGSEGV). \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Системный вызов (syscall). \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Системный вызов (вызов API ядра Linux) — не бесплатная операция и лучше их держать под контролем на высоконагруженных приложениях.\n   * Команда анализа системных вызов процесса через `strace`. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Самый простой и доступный способ посмотреть какие системные вызовы делает процесс в реальном времени.\n1. Изучение понятия `дескриптор`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Любой поток данных (входящий и/или исходящий) представляется в виде дескрипторов. Что-либо читать или писать будете (вероятней всего) через дескриптор.\n   * Стандартные дескрипторы `STDIN`, `STDOUT`, `STDERR` и их нумерация. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Любой поток в процессе пронумерован и есть \"зарезервированные\" номера под определенные потоки.\n   * Потоки, сокеты и unix-сокеты. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Это всё разновидности дескрипторов с которыми придётся работать. На всех них распространяются правила дескрипторов, ну так как они и есть дескрипторы.\n   * Ограничение на дескрипторы. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Не редкая проблема приложений когда оно упирается в лимит открытых дескрипторов.\n   * Команда анализа открытых дескрипторов у процесса через `lsof`. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Для отладки приложения всегда надо знать с чем ведёт общение приложение (отлично работает в паре с `strace`, сопоставляя номера дескрипторов).\n1. [Пользователи](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/19.%20Пользователи.md) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Пользователь `root`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e По сути это админ системы. Избегайте использование root (даже в контейнерах) так как доступ к root даёт доступ ко всей системе, о чем мечтают все зловреды.\n   * Супер пользователь, команды [su](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/17.%20su.md) и [sudo](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/18.%20sudo.md). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Никто не даст вам root на проде, но вполне можете иметь \"привилегированного\" пользователя, который умеет в `sudo`.\n1. [Файловая система](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/04.%20%D0%9E%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D1%8B%D1%85%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D1%85.md) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Команда `stat` \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Права и доступы файловой системы](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/20.%20Права%20на%20файлы.md) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Избыточные доступы ведут к дыре в безопасности, недостаток доступов ведёт к багам в приложении. Осмысленно ставьте где `x` (особенно у директорий), где `r`, а где `w`.\n   * Понимание описания доступов вида `--xr-xrwx` и `0137` (восьмеричная) у файлов и директорий. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Обычно в таком виде вы будете видеть уровни доступов в консолях.\n   * Исполняемые файлы, [sha bang](https://ru.wikipedia.org/wiki/Шебанг_(Unix)). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Изменение прав доступов через команды `chmod`, `chown`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * [Работа с дисками](https://gitlab.com/doatta/gnu-linux-rhcsa/-/blob/master/22.%20Работа%20с%20дисками.md) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Нужно знать где, как и куда примонтированы различные диски или носители. Бывает, что приложение может работать сразу с несколькими дисками, некоторые могут быть сетевыми.\n1. Ссылки на файловой системе. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Symlink (aka символическая ссылка). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый распространённый вид ссылки. Повсеместно используется в Linux да и пакетных менеджерах разных языков. Вы тоже будете это использовать.\n   * Hardlink (aka жесткая ссылка). \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Редкий случай использования ссылки. Потребуется если надо \"дедуплицировать\" большой объём файлов.\n     \u003e По сути позволяет создать несколько имён одному файлу.\n1. Запуск и остановка сервисов systemd. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Linux по сути просто пачка запущенных приложений как сервисов.\n1. [SSH](https://ru.wikipedia.org/wiki/SSH). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Самый доступный способ запустить `shell` на удалённой машине это использовать SSH. Используется повсеместно.\n   * Генерация собственного ssh-rsa ключа через `ssh-keygen`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Без него вы не попадёте на хосты по SSH.\n   * Использование публичного ssh-rsa ключа для входа на удалённую машину (используйте второй контейнер с Linux). \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Перенос контента. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Появляется потребность перекинуть логи, дамп базы и другие файлы между машинами или к себе.\n   * `scp` \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e самый простой инструмент переноса файлов между хостами по ssh.\n   * `rsync` \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e пожалуй самый мощный инструмент переноса файлов между хостами с кучами настроек, правил и протоколов.\n   * `rclone` \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e \"rsync\" для облачных хранилищ. Универсальный инструмент для работы с контентом, который хранится в облаках или где-то по сети. \n1. Планировщики задач\n   * Команда `crontab` и запуск `crond`.\n     \u003e Самый распространённый и простой планировщик задач, с весьма гибкими настройками расписания\n   * Команда `at` \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Когда хотите запустить задачу разово, к определенному времени.\n     \u003e В crontab это потребует отдельно создавать расписание, что сильно затрудняет автоматику и захламляет всё расписание.\n1. Оперативная память. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Команда `free`, мета информация `/proc/meminfo`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Всегда оценивайте сколько памяти потребуется приложению или скриптам, чтобы не быть убитыми системой.\n   * Ошибка `Out Of Memory` (OOM) и причина появления. [OOM-киллер](https://habr.com/ru/company/southbridge/blog/464245/). \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Именно это происходит когда вы превысили все допустимые пределы потребления памяти в системе.\n1. [Логи системы](https://habr.com/ru/post/332502/). Для чего и как посмотреть. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Когда случаются проблемы то логи — единственное, что может навести на суть проблемы. \n   \u003e Помимо логов приложения стоит заглядывать в логи системы, иногда её проблема может вести к проблеме в приложениях. Стоит выделить некоторые логи:\n   * `dmesg` (driver messages) — важные сообщения от компонентов Linux, включая от OOM-киллера. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * `syslog` — системный журнал. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Там могут быть сообщения от ядра Linux, различных служб, сетевых интерфейсов и многого другого.\n1. Проблемы в Linux и последствия. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Их много, но выделим только несколько.\n   * Kernel panic. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e BSoD аналог для Linux. Самая не приятная ошибка системы, явно намекающая, что система не стабильна.\n   * Segmentation fault (aka segfault aka сегфолт). \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Не такая уж и редкая ошибка приложений, как хотелось бы. Приложение попыталось работать с памятью доступа к которой у неё нет.\n   * Core dump (aka корка). \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Результат обработки segmentation fault системой. Корка может потребоваться разработчику упавшего приложения для анализа состояния программы на момент падения.\n\n# Этап 3. Общие знания\n\nНекоторые пункты сложно категоризировать в этом документе. Но без них не обойтись. \nЭто базовые вещи которые используются повсеместно в коде, в системах, \"под капотом\" вашего языка программирования.\n\n1. Регулярные выражения. Поиграться регулярными выражениями можно [тут](https://regex101.com/). Хоть каждый язык может иметь своё видение регулярных выражений, в общем смысле (и синтаксисе) они похожи. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Рано или поздно придётся спарсить данные из текста или проверять данные, вот тут как раз и потребуются регулярные выражения.\n1. Криптография. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Не пугайтесь. Пункт подразумевает прикладное применение криптографических функций (для чего нужны те или иные функции), а не изучении самой криптографии.\n   *  Хеши и хеш-функции, в том числе `crc32`, `md5`, `sha1`, `sha256`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Цифровые подписи. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Чтобы обезопасить от подделки данных используются цифровые подписи этих же данных.\n   * Соль для подписей. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e В теории (да и на практике) хеш-функцию можно определить и чтобы сильнее обезопасить от \"взлома\" вашего хеша, используя так называемую соль.\n   * Коллизии хешей. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Хеш-функции могут на разных данных вернуть один и тот же результат (хеш), что может привести к проблемам и багам.\n     \u003e Лучше знать какова вероятность коллизий у хеш-функции и как их избегать.\n   * Симметричное и асимметричное шифрование. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Иногда приходится шифровать данные и важно выбрать стратегию шифрования.\n   * [Принцип работы TLS](https://habr.com/ru/post/188042/). \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Имеется ввиду как работаю CA корневые и промежуточные, что стоит за сертификатом.\n1. [Базовая работа с `git`](https://www.youtube.com/watch?v=zZBiln_2FhM). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e По факту это дефолтная система контроля версий в мире IT.\n   * Коммит изменений (commit) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Отправка изменений (push/pull) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Создание веток и тегов (branch/tag) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Слияние веток (merge) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Упороться полностью git'ом](https://git-scm.com/book/ru/v2) \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n1. Структуры данных. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Хеш таблицы. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Таблицы часто используются в самих языках программирования (ассоциативные массивы, объекты и т.п.)\n   * Очередь и стек. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самые простые структуры данных, которые часто придётся использовать повседневно в коде.\n   * [Связный список](https://ru.wikipedia.org/wiki/Связный_список) и [двусвязный список](https://ru.wikipedia.org/wiki/Связный_список#Двусвязный_список_(двунаправленный_связный_список)). \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Эти структуры данных часто используются в разработке так как являются самым простым способом связать элементы с собой.\n     \u003e Они так же активно используются внутри вашего языка (под \"капотом\") повсеместно.\n1. Форматы хранения и передачи данных\n   * Текстовые. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Текстовые форматы используются так же для хранения конфигурации приложений\n     * JSON\n     * YAML\n     * XML\n   * Бинарные. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Бинарные форматы используются сугубо для хранения и передачи данных.\n     * MessagePack\n     * BSON (бинарный аналог JSON)\n     * ProtoBuf\n\n# Этап 4. Сеть\n\nСеть в разработке самая важная и, часто, мало заметная часть.\n\n1. Базовое понимание работы сети. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Протокол TCP \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Вы вряд ли будете читать пакеты TCP. Но полезно знать КАК работает TCP,\n     \u003e это позволит понять почему при идеальных \"интернетах\" всё равно приложение может лагать по сети.\n     * TCP пакет \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n       \u003e Вряд ли придётся работать с пакетом TCP напрямую, однако из его структуры можно подчерпнуть некоторую полезную информацию по протоколу TCP в целом.\n     * Флаги ACK, SYN, FIN и прочие \u003ckbd\u003emiddle+\u003c/kbd\u003e\n       \u003e Флаги отвечают за организацию, подтверждение передачи и закрытие TCP коннектов.\n     * Буферы (window size) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * [Проблемы TCP](https://www.youtube.com/watch?v=aXYJlizk3CQ) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n       \u003e TCP очень старый протокол, который уже не удовлетворяет современным реалиям.\n   * Протокол UDP. \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Самый простой сетевой протокол семейства. Требуется понимание его работы.\n     \u003e HTTP/3.0, DNS работает на протоколе UDP, и понимание UDP даст немного понимания в работе HTTP/3.0\n     * UDP-пакет \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n       \u003e Изучить придётся только если потребуется создать свой протокол передачи данных взамен изжившего себя TCP.\n1. Проблемы сети. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Их, как всегда, много. Но стоит выделить те, которые явно влияют на скорость работы сети.\n   \u003e По большей части эти проблемы присущи TCP, но могут появиться и там где эмулируют TCP — на другом протоколе (например UDP)\n   * Packet loss \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Reordering \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Jitter \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Round-Trip Time (RTT aka лаг) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Сетевое ожидание](https://developer.mozilla.org/ru/docs/Web/Performance/Understanding_latency) (Network latency, задержка) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. IPv4, IPv6.\n   \u003e Базовое отличие протоколов надо знать, хотя бы, чтобы правильно создать колонку IP в базе и обработку в коде.\n1. [DNS](https://developer.mozilla.org/ru/docs/Learn/Understanding_domain_names). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Ваш код 24/7 будет работать с доменами так как никто не использует чистый IP для соединения с чем-либо.\n   \u003e Зная как работает DNS и управление резолвингом домена в системе, можно упростить отладку в некоторых случаях.\n   * [Как работает резолвинг доменов](https://temoto.github.io/a/kak-rabotayut-domeny.html) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [DNS записи](https://ru.wikipedia.org/wiki/Типы_ресурсных_записей_DNS) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Основные MX, CNAME, NS, A, AAAA, TXT \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Прочие записи \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Файл `/etc/hosts` \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый простой и доступный способ поменять IP любому домену, локально, конечно же.\n   * Файл `/etc/resolv.conf` \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Конфигурация для системы, как и где надо резолвить домены.\n   * Консольные команды работы с доменами: `whois`, `dig`, `host`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Чтобы идентифицировать проблему с доменом нужно научиться работать с этими командами. \n     \u003e Анализируйте домены как через дефолтный для себя DNS так и через публичные, такие как `1.1.1.1` или `8.8.8.8`.\n1. Трассировки маршрутов. \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Анализ трафика через `tcpdump` + `wireshark` \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n   \u003e Не простой, но очень эффективный способ \"увидеть\" и проанализировать трафик в удобном UI.\n1. [Упороться сетью полностью 🇺🇸](https://hpbn.co/) \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n\n# Этап 5. Базы данных\n\nБез баз данных — никуда. Самый частый вид баз данных — реляционные базы данных.\nПоэтому даже \u003ckbd\u003ejunior\u003c/kbd\u003e должен уметь работать с ними,\nа вот с NoSQL базами данных можно ознакомиться чуть позже.\n\n1. Реляционные базы данных MySQL/Postgres/и т.д. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e MySQL подразумевает как MySQL от Oracle, так и различные варианты в виде MariaDB, Percona XTraDB и т.д.\n   \u003e В общем понимании семейства: MySQL/Postgres/MSSQL/и т.д. имеют схожие SQL API, различаются только внутренней реализацией, производительностью и масштабируемостью.\n   * Базовый синтаксис запросов `SELECT`/`INSERT`/`UPDATE`/`DELETE`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Создание и модификация таблиц \u003ckbd\u003ejunior\u003c/kbd\u003e\n       * Типы колонок таблиц их назначение и различие \u003ckbd\u003ejunior\u003c/kbd\u003e\n           * Целочисленные типы (int)\n           * Текстовые типы (text)\n           * Наборы, перечисления (enum)\n           * Строковые типы (char, varchar)\n           * Десятичные типы (decimal)\n           * Числа с плавающей запятой (double)\n           * прочие\n       * Создание и применение ALTER запросов. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Анализ выполнения запросов через `EXPLAIN`, понимание результатов `EXPLAIN`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый действенный способ понять почему тормозит запрос.\n   * Диагностика производительности.\n     \u003e Всегда будут появляться медленные запросы, и чем их больше, тем медленнее будет работать ваше приложение.\n     \u003e И как правило у разных баз данных всегда есть аналитика для поиска \"узких\" мест.\n      * Ведение логов медленных запросов — slow_log. \u003ckbd\u003emiddle\u003c/kbd\u003e\n        \u003e Не получится сидеть всё время, мониторя все запросы. Проще настроить агрегацию медленных запросов.\n      * Чтение аналитики и статистики \u003ckbd\u003emiddle+\u003c/kbd\u003e\n        \u003e В MySQL семействе это perfomance_scheme, в postgres это Statistics Collector. \n        \u003e Поможет в полной мере понять какие запросы плохо работают, где не достаёт индексов, где их в избытке и так далее.\n   * Индексы \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Индексы очень важная часть баз данных. Ваши запросы всегда должны работать \"по индексам\".\n     \u003e Запрос без индекса или с \"плохим\" индексом, на нагруженных проектах, гарантировано может привести к падению приложения.\n     * Кластерный индекс \u003ckbd\u003emiddle\u003c/kbd\u003e\n       \u003e Это не относится к вычислительным кластерам. Это индекс данных, по нему и укладываются строки в таблице.\n     * PRIMARY индекс (aka первичный индекс) \u003ckbd\u003ejunior\u003c/kbd\u003e\n       \u003e Индекс, уникально идентифицирующий каждую строчку в таблице. Как правило, PRIMARY индекс и есть кластерный индекс.\n     * UNIQUE/обычные индексы \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * Составные индексы. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       \u003e Условия и/или сортировки редко когда бывают по одному полю, обычно их больше. Вот тут на сцену выходят составные индексы.\n       \u003e Тут надо понимать что в составном индексе, последовательность полей важна.\n       * Понимание какие поля в какой последовательности добавлять в индекс при фильтрации и/или сортировке. \u003ckbd\u003emiddle\u003c/kbd\u003e\n       * Понимание как строятся деревья индексов у составных индексов. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     * [Понимание работы индексов](https://highload.today/indeksy-v-mysql/) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Алгоритм построения индексов `BTREE`. \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n       \u003e Это понимание не сделает ваши запросы быстрее, но даст понятие как ведут себя те или иные данные в индексах.\n     * Объединение таблиц `LEFT JOIN`, `RIGHT JOIN`, `INNER JOIN`, `OUTER JOIN`, `JOIN`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       \u003e Данные всегда \"размазаны\" по таблицам. Чтобы их собрать потребуются эти операторы.\n     * Группировка данных через `GROUP BY`. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       \u003e Группировка данных — не редкие запросы, как правило, используются для сбора статистики.\n       * Фильтрация после группировки. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       * Функции работы с группами MAX/MIN/AVG/и т.д. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * Понимание и назначение внешних ключей (`foreign key`) \u003ckbd\u003emiddle\u003c/kbd\u003e\n       \u003e Нередко используют внешние ключи для поддержания консистентности данных в базе.\n     * Транзакции. \u003ckbd\u003emiddle\u003c/kbd\u003e\n       \u003e Чтобы провести несколько операций атомарно (как одну операцию) используются транзакции.\n       * Уровни изоляций транзакций. \u003ckbd\u003emiddle\u003c/kbd\u003e\n       * Deadlock и как его не допускать. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     * Триггеры на `INSERT`/`UPDATE`/`DELETE`. \u003ckbd\u003emiddle\u003c/kbd\u003e\n       \u003e Не стоит активно использовать триггеры.\n       \u003e Тем не менее они могут оказаться полезными в некоторых отладочных или maintenance случаях.\n     * Хранение деревьев. \u003ckbd\u003ejunior\u003c/kbd\u003e\n       \u003e Не просто сохранить древовидную структуру в реляционной базе. Есть насколько алгоритмов со своими плюсами и минусами.\n       \u003e На самом деле актуально и для других видов баз данных\n       * Алгоритм parent-child \u003ckbd\u003ejunior\u003c/kbd\u003e\n         \u003e Классический вариант \"с parent_id\" у дочерних элементов. Простые и \"дешевые\" на вставку элементов в деревья.\n         \u003e Но такие деревья затратные \"на сборку\".\n       * Алгоритм [nested sets](https://ru.wikipedia.org/wiki/Вложенное_множество_(модель)) \u003ckbd\u003emiddle\u003c/kbd\u003e\n         \u003e Алгоритм позволяет достаточно дёшево собирать деревья с различными модификациями и сегментами.\n         \u003e Но затратные на вставку элементов в деревья.\n1. Документо-ориентированная база данных (часть NoSQL баз данных) — MongoDB. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Среди всех NoSQL самой популярной является MongoDB.\n   * Типы данных в коллекциях, их назначение и различия. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Анализ выполнения запросов через `explain()`, понимание его результатов. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Понимание работы индексов (аналогично SQL индексам с небольшими отличиями). \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Sparse свойство индекса\n     * Partial свойство индекса\n     * TTL свойство индекса\n     * Geospatial индекс\n     * Text индекс\n   * Вложенные объекты, массивы. \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Агрегации \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Работа с репликацией. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Работа с кластером MongoDb. \u003ckbd\u003emiddle+\u003c/kbd\u003e\n1. Redis \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Универсальный инструмент хранения данных с уклоном в производительность.\n   \u003e Может быть, как быстрым постоянным хранилищем, так и реактивным кэширующим, временным хранилищем.\n   * [базовая работа с ключами](https://redis.io/commands#generic) :us: \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [работа со списками](https://redis.io/commands#list) :us: \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [работа с хешами](https://redis.io/commands#hash) :us: \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [работа с набором](https://redis.io/commands#set) :us: \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [сортированным набором](https://redis.io/commands#sorted_set) :us: \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * [Транзакции](https://redis.io/topics/transactions) :us:, но в другом, своём, понимании.\n   * [Работа с Lua](https://redis.io/commands/eval) :us: \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Даёт возможность запустить любой набор команд атомарно, дополнительно снабдив логикой.\n1. Проблемы в базах данных \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Deadlock \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Переполнение числовых полей (в том числе autoincrement) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Full scan \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Split-brain \u003ckbd\u003emiddle+\u003c/kbd\u003e\n\n# Этап 6. Протокол HTTP\n\nКаждый WEB разработчик должен понимать протокол HTTP.\nРазработчик который не знает HTTP протокол — это как сапожник без сапог.\nПоэтому даже \u003ckbd\u003ejunior\u003c/kbd\u003e должен многое знать про протокол HTTP.\n\n1. [Понимание общего формата протокола](https://developer.mozilla.org/ru/docs/Web/HTTP/Overview): где заголовки, а где тело. \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Сродниться со вкладкой Сеть/Network в инспекторе браузера \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e В консоли можно наблюдать все HTTP-запросы со страницы и даже делать самим через функцию `fetch`.\n1. [Методы HTTP-запросов.](https://developer.mozilla.org/ru/docs/Web/HTTP/Methods) Их назначение и ограничения. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Каждый метод имеет своё назначение (достаточно перевести названия методов) и, как следствие, имеет свои условности и ограничения.\n   * Основные [GET](https://developer.mozilla.org/ru/docs/Web/HTTP/Methods/GET), [POST](https://developer.mozilla.org/ru/docs/Web/HTTP/Methods/POST), [HEAD](https://developer.mozilla.org/ru/docs/Web/HTTP/Methods/HEAD) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Дополнительные `PUT`, `DELETE`, `PATCH` \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Используются в REST API вместе с основными методами\n   * Прочие \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Это уже методы узкой направленности, редко когда придётся с ними напрямую работать. Тем не менее они активно используются приложениями.\n1. [Коды HTTP ответов](https://developer.mozilla.org/ru/docs/Web/HTTP/Status) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Принцип разделения кодов на группы: 100-199, 200-299, 300-399, 400-499, 500-599. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Коды создавались и описывались не в хаотичном порядке. Есть чёткое разделение их \"сфер влияния\".\n     \u003e Даже если какой-то сервер придумает свой код ответа, то по группе вы сможете лучше понять причину такого ответа.\n   * Основные (частые): [200](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/200),\n     [206](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/206),\n     [301](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/301),\n     [302](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/302),\n     [304](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/304),\n     [400](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/400),\n     [401](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/401),\n     [403](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/403),\n     [404](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/404),\n     [500](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/500),\n     [502](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/502),\n     [503](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/503),\n     [504](https://developer.mozilla.org/ru/docs/Web/HTTP/Status/504) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Это наиболее частые коды ответов которые вы гарантировано встретите.\n   * [Другие](https://developer.mozilla.org/ru/docs/Web/HTTP/Status) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. [Заголовки HTTP](https://developer.mozilla.org/ru/docs/Web/HTTP/Заголовки) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [MIME тип](https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types) (тип документа) и заголовок типа [Content-Type](https://developer.mozilla.org/ru/docs/Web/HTTP/Заголовки/Content-Type). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * Формат передачи `application/x-www-form-urlencoded` \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * Формат передачи [multipart/form-data](https://ru.wikipedia.org/wiki/Multipart/form-data) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Системные заголовки Host, Content-Length,\n     [Content-Encoding](https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Content-Encoding),\n     [Transfer-Encoding](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding)) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Кэширование HTTP](https://developer.mozilla.org/ru/docs/Web/HTTP/Кэширование), заголовки управления кэшем: `Cache-Control`, `Expires`, `Vary`, `ETag`, `Last-Modified`.\n1. [Куки](https://developer.mozilla.org/ru/docs/Web/HTTP/%D0%9A%D1%83%D0%BA%D0%B8) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e На данный момент это единственный точный способ идентифицировать пользователя.\n1. [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/ru/docs/Web/HTTP/CORS) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Для кросс-доменных XHR/WebSocket запросов надо научиться работать с CORS, иначе запросы не будут работать.\n1. [Content-Security-Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Для повышения безопасности можно ограничить и указать что и откуда может загружаться и запускаться на странице.\n1. Различия версий протокола HTTP: HTTP/1.0, HTTP/1.1 \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Не смотря на появление новых версий протокола HTTP, версии HTTP/1.0 и HTTP/1.1 всё еще остаются частыми во внутренних сетях кластеров.\n1. Консольные команды HTTP запросов `curl`, `wget` \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e На серверах (хостах) нет браузеров, чью удобную консоль можно использовать.\n   \u003e Там есть shell и множество утилит, которые умеют работать с HTTP.\n1. Различия протоколов HTTP/1.1, HTTP/2.0 и HTTP/3.0 \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   \u003e Каждый протокол имеет свои возможности и улучшения, которые можно использовать для ускорения приложения.\n1. WebSocket протокол \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Это расширения версии HTTP/1.1 и выше для механизма обмена данными по одному соединению.\n   \u003e Часто используется для чатов и/или для event-driven модели.\n1. WebRTC \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n   \u003e Если надо будет организовывать P2P (peer-to-peer) чаты или P2P стриминг, то WebRTC как раз для этого.\n1. HTTP API форматы \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [REST API](https://ru.wikipedia.org/wiki/REST) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * RPC \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [GraphQL](https://habr.com/ru/post/326986/) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Web сервера \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Nginx](https://nginx.org). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - высока.\n     * [Ознакомление с базовыми возможностями](https://nginx.org/ru/docs/beginners_guide.html) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * [Масштабируемая конфигурация nginx](https://www.youtube.com/watch?v=jf3wIN-FwW4) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Написание простых локаций в `/etc/nginx/nginx.conf` раздачи файлов \u003ckbd\u003ejunior\u003c/kbd\u003e\n     * HTTP, FastCGI проксирование \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Apache httpd](https://httpd.apache.org/). \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Один из старых, но активно использующихся Web-серверов широкого профиля. \n     \u003e Хоть он уже и уступает nginx-у в популярности, но столкнуться с ним в проекта есть всё так же легко. \n\n# Этап 7. Безопасность\n\nВаше приложение всегда под угрозой, даже если это какое-то home-page приложение.\nБотнетам всегда не хватает вычислительных ресурсов. Хакерам — данных. А пользователям — мозгов (без обид).\n\n1. Виды управления доступом \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Access Control List (ACL) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * [Role-based access control](https://habr.com/ru/company/custis/blog/248649/) (RBAC) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * [Attribute-based access control](https://habr.com/ru/company/custis/blog/248649/) (ABAC) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Аутентификация \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [Basic](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый простой вид авторизации, не требующий дополнительных вычислительных мощностей (серверов).\n   * [SSO](https://habr.com/ru/company/nixys/blog/563244/) (Single Sign On) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Общее название подхода к авторизации: авторизация на множестве приложений через одну точку. OAuth и OpenID — частные случаи SSO.\n   * [OAuth2](https://www.digitalocean.com/community/tutorials/oauth-2-ru) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Распространенный вид авторизации через посредника, который гарантирует что Вы это Вы и может выдать некоторые данные по пользователю, с его согласия.\n     \u003e Часто сталкиваются c OAuth2 тогда когда надо подключить авторизацию через соц. сети. У них у всех OAuth2 (но каждый со своими модификациями).\n   * OpenID \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Один из первых популярных SSO. Уступает Oauth2 по популярности, но так же где-то используется.\n   * Ldap \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Данный вид авторизации используется, чаще всего, для авторизации во внутренних сервисах своих сотрудников.\n   * JSON Web Token (JWT) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Это не тип авторизации, а инструмент для передачи идентифицирующих данных. Однако такой токен может иметь очень широкое применение, не только в авторизации.\n1. [Виды атак и уязвимостей](https://docs.wallarm.ru/attacks-vulns-list/) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Фишинг сайта \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Небезопасное перенаправление, Open Redirect \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Инъекции (например SQL-инъекции) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * XSS атака \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * IDOR уязвимость \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * CRLF атака \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * LFI/RFI атака \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * DoS/DDoS \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * HTTP-флуд \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * SYN flood (потребуются знания TCP) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     * UDP flood (UDP амплификация) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     * Медленный запрос \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Бомбы \u003ckbd\u003emiddle\u003c/kbd\u003e\n      * Logic Bomb \u003ckbd\u003emiddle\u003c/kbd\u003e\n      * Zip Bomb \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Атака посредника (Man In The Middle, MITM) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Брутфорс (например брутфорс паролей) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Спуфинг \u003ckbd\u003emiddle\u003c/kbd\u003e\n\n# Этап 8. Тут должен быть ваш язык программирования\n\nЯзыков программирования много. Однако, они имеют много общего между собой, кто-то больше, а кто-то меньше.\nЭтот этап будет задевать только часто встречающиеся пункты в большинстве популярных языков программирования.\nЭтап не будет чётко дробиться на градации, так как многое зависит от самого языка, его возможностей и его расширений.\n\nПринцип работы с этим разделом: ищите `%ваш_язык_программирования% %пункт_из_этапа%`.\nУчтите, что **некоторых пунктов может не быть в вашем языке**.\n\n1. Что такое интерпретатор, компилятор, JIT, оп-код, байт-код. Что из этого использует ваш язык? \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Ваш язык программирования \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Примитивные типы данных \n     \u003e Базовые скалярные типы — целые числа, строки, булевы значения, числа с плавающей точкой, null/nil и так далее.\n   * Функции, макросы.\n     * Определение и их вызов\n       \u003e Умение определить простую функцию и вызвать её. Бывают языки где функций без объектов не может быть\n     * Главная функция или точка входа в программу.\n       \u003e В языке программа может запускаться только через стартовую функцию, например `main()`. \n       \u003e Но некоторые языки позволяют запустить файл с кодом.\n   * Набор, массив, хеш-таблица (ассоциативный массив), кортеж.\n     \u003e Представляет собой различные комбинации примитивных типов. Например числовой массив данных можно сделать почти в любом языке.\n   * Объекты/классы/структуры, прототипы/интерфейсы/миксины.\n     \u003e Все современные языки имеют объекты и умеют ими оперировать. \n     * Перегрузка операторов\n       \u003e Позволяет объектам самим определять как над ними производить математические, логические и прочие действия (операции).\n     * Перегрузка методов\n       \u003e Позволяет определить несколько методов с одним названием, но с разной сигнатурой.\n       \u003e Как правило это достигается за счет различного набора параметров (количества или типов принимаемых значений) для каждого метода.\n     * Generics (aka генерики aka шаблоны aka обобщения)\n       \u003e Специфичная возможность некоторых языков программирования со строгой типизацией. \n       \u003e Позволяет определить единую сигнатуру для обработки различных типов.\n     * Объектно-ориентированное программирование (ООП)\n   * Ссылки, слабые ссылки.\n   * Области видимости переменной.\n     \u003e Важно понимать когда ваши переменные доступны в коде, а где уже/ещё нет. Особенно важно это понимать когда работаете с ссылками.\n   * Garbage Collector (GC).\n     \u003e Много языков высокого (и не только) уровня имеют GC. GC отвечает за освобождение памяти от мусора (забытые данные, данные которые уже не нужны коду) \n     \u003e в процессе работы кода. Это очень важная часть вашего языка, так как пока работает GC — не работает ваш код. \n     \u003e А если GC будет часто и/или много работать то ваше приложение начнет лагать и \"зависать\".\n     * Когда и как запускается GC.\n     * Изучить настройки GC.\n     * Включение/выключение GC, принудительный запуск GC.\n     * Профилирование утечек или потребления памяти.\n   * Преобразование типов.\n   * Слабая/сильная типизация в коде. На что влияет и как с этим жить.\n     \u003e Сильная типизация требует явного указания в коде типа данных, которые будут использоваться в переменной, аргументе и т.д. \n     \u003e А динамическая, наоборот, позволяет не указывать тип. Вычисление типа значения будет происходить динамически, в момент выполнения программы/программного кода (runtime). \n     \u003e Некоторые языки могут поддерживать одновременно как строгую так и слабую типизации.\n   * Битовые операции: `not`, `and`, `or`, `xor`, сдвиг влево, сдвиг вправо \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Часто вместо `or` и `and` используются символы `|`/`||` и `\u0026`/`\u0026\u0026`.\n     \u003e С битовыми операциями можно столкнуться чаще чем кажется, много функций/методов принимают опции в виде битовых флагов вида `READ|WRITE|CREATE`.\n     \u003e Нужно уметь комбинировать битовые флаги, удалять, определять какие флаги установлены. \n   * Обработка ошибок. Исключения, паники, error и прочие проявления _ошибок_.\n   * Проблемы в коде\n     * Бесконечные циклы\n     * Рекурсии\n     * Погрешность в числах с плавающей запятой (float, double, number).\n     * Ошибка сегментации (и ее связь с сигналом SIGSEGV)\n1. Распараллеливание вычислений \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Вычислять в один поток, используя 1 CPU, неимоверно удобно и просто. Однако в этом случае вы ограничены скоростью 1 CPU, что \n   \u003e может занять много времени. Для ускорения сложных вычислений или действий использоют несколько CPU одной или нескольких машин.\n   \u003e Но это будет \"стоить\" не дёшево.\n   * Процессы\n     * Создание дочернего процесса через [fork](https://ru.wikipedia.org/wiki/Fork).\n     * Поведение дескрипторов до и после fork.\n     * Разделяемая память (Shared memory)\n     * Межпроцессное взаимодействие (IPC)\n   * Потоки (threads)\n     \u003e В отличии от процессов, потоки имеют общую память, как следствие, всегда единую кодовую базу.\n     * Истинные потоки (pthreads, posix-threads)\n     * Зелёные потоки (Green threads)\n       \u003e Ведут себя как истинные потоки, но таковыми не являются, так как только эмулируют распараллеливание.\n   * КоРутины\n     \u003e Вариант распараллеливания, когда один код приложения, ожидающий событие системы, уступает CPU другому коду приложения. \n     \u003e Выполняются-ли они параллельно - зависит от реализации.\n   * Проблемы распараллеливания\n     * Race Condition (aka race aka состояние гонки)\n       \u003e Как только у вас что-то может пойти параллельно у вас сразу же появится вероятность получить проблему RACE.\n       \u003e На устранение или недопущение RACE всегда расходуются вычислительные ресурсы. И проблему RACE всегда сложно диагностировать.\n       \u003e Поэтому параллелят вычисления только там где это остро необходимо.\n     * Deadlock\n       \u003e Как и в базах данных случается так что два или более параллельных вычисления ждут друг друга. И не дождутся.\n   * Атомарные операции\n     \u003e При работе в потоках, для избежания Race, языки реализовывают атомарные операция, позволяющие безопасно менять значения переменным.\n   * Блокировки \n     \u003e Чтобы избегать Race нужно использовать блокировки.\n     * Mutex (aka Мьютекс / aka mutual exclusion)\n       \u003e По сути это атомарная блокировка.\n     * Семафоры\n       \u003e Упрощенный вид mutex\n1. Пакетный менеджер или менеджер зависимостей. \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Расширения языка\n   \u003e Высокоуровневые языки, обычно, расширяются модулями, написанными на низкоуровневом языке, на котором написан сам обработчик языка.\n1. Отладчик (aka дебаггер)\n   \u003e Большую часть времени вы будете не писать новый код, а производить отладку уже написанного кода. \n   \u003e В некоторых языках отладчик уже \"встроен в язык\", но некоторые языки требуют дополнительные модули или инструменты для этого.\n1. Запуск сервера и работа c ним в языке (обработка HTTP-запросов). \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Некоторые языки в коде запускают сервера, а некоторые имеют отдельный сервер который запускает код. Может быть и то и то.\n1. Кэширование данных \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Частые алгоритмы кэша [LRU](https://ru.wikipedia.org/wiki/Алгоритмы_кэширования#Least_recently_used_(Вытеснение_давно_неиспользуемых)), LFU\n   * [Иные алгоритмы кэширования](https://ru.wikipedia.org/wiki/Алгоритмы_кэширования) \u003ckbd\u003eguru ⚡\u003c/kbd\u003e\n   * Прогревание кэша, инвалидация кэша\n1. Шаблонизация\n   \u003e Генерировать UI через `print`'ы очень плохая практика из-за множества проблем с поддержкой такого кода, с ростом проекта и контрибуторов.\n   \u003e В вашем языке должны быть пакеты/модули для шаблонизации. И, как правило, их несколько.\n1. Юнит тестирование \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e Ознакомление с системой тестирования в вашем языке. Подбор пакета/модуля для тестирования.\n1. Специфика работы IO (сокетов, дескрипторов, потоков) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Буферы IO\n   * Асинхронный IO\n\n# Этап 9. Электронная почта\n\nРабота с email, неотъемлемая часть web-разработки (да и не только). По факту, это единственный гарантированный канал связи с пользователем.\n\n1. [Спецификация письма MIME](https://www.opennet.ru/docs/RUS/inet_server/servers_glava2_5.html) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Основные заголовки: `Return-Path`, `Received`, `From`, `To`, `Cc`, `Bcc`, `Reply-To`, `Subject`, `Message-ID` \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * прочие заголовки \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * указание кодировки \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * кодирование полей и тела в base64 и qp (quoted-printable) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Установка [MailHog](https://github.com/mailhog/MailHog) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Это почтовый сервер для тестирования работы отправки писем приложениями, который можно поднять локально в контейнере.\n\n# Этап 10. Полнотекстовый поиск\n\nКаждый разработчик сталкивается с необходимостью полнотекстового поиска, да и в целом быстрого поиска по куче атрибутов и текстов.\nДля этого используются различные полнотекстовые поисковые движки такие как [ElasticSearch](https://www.elastic.co/), [SphinxSearch](http://sphinxsearch.com/), [ManticoreSearch](https://manticoresearch.com/), [MeiliSearch](https://www.meilisearch.com/) и т.д.\nСамый распространенный полнотекстовый поисковый движок с большим сообществом — ElasticSearch.\n\n1. Установить [Cerebro](https://github.com/lmenezes/cerebro) для работы с ElasticSearch. \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Индексы \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Alias \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Настройки \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Шаблоны \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Mapping \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Запросы \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Запросы поиска \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Запросы добавления/обновления/удаления документов \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * bulk запросы \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Запросы на изменение лучше делать пачкой, так называемым bulk-ом.\n   * painless-скриптинг \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e потребуется чтобы точечно обновить некоторые поля у документа или вложенные документы, вместо всего документа\n1. Подключение или изменение морфологий \u003ckbd\u003ejunior\u003c/kbd\u003e\n1. Агрегации \u003ckbd\u003emiddle+\u003c/kbd\u003e\n1. Lucene индексы \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   \u003e Основную работу по индексации и поиску выполняют Lucene-индексы. Сам ElasticSearch — кластер с HTTP-сервером, \n   \u003e гарантирующий сохранность Lucene-индексов и отвечающий за их репликацию и шардирование.\n   \u003e Если вам нужно чтобы была быстрая индексация и/или быстрый поиск то вам надо тюнить работу Lucene-индексов.\n\n# Этап 11. Логи и метрики\n\nМетрики позволят узнать о проблеме, а логи позволят понять причину проблемы. Для крупных и/или распределённых систем этот тандем обязателен.\nДля обработки большого объёма данных нужны подходящие системы для сбора, хранения и агрегации.\nЛюбое приложение должно уметь генерировать _полезные_ метрики для системы сбора и анализа метрик. И писать _правильные_ системные логи о _своих_ событиях. \nЛоги о событиях пользователей уже относятся к аудиту, а не к системным логам.\n\n1. Системы хранения и обработки логов\n   \u003e Их на самом деле много, но среди бесплатных opensource, по популярности выделяются несколько\n   * Решение [ELK](https://www.elastic.co/what-is/elk-stack) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Не самая тривиальная, но эффективная для приёма, обработки, хранения и работы с логами.\n     \u003e ELK: Logstash - парсит логи, ElasticSearch - хранит логи, Kibana - UI для ElasticSearch для работы с логами.\n   * [ClickHouse](https://clickhouse.tech/docs/ru/) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n     \u003e Колоночная база данных, которая отлично справляется с большим количеством логов (и не только access). Если проводить аналогию с ELK то:\n     \u003e MaterializedView - позволяет парсить (структурированные) логи, семейство MergeTree — хранит логи.\n     \u003e А вот UI только сторонний брать, например Grafana или [Kibana](https://www.highload.ru/moscow/2019/abstracts/5906).\n   * [Grafana Loki](https://grafana.com/oss/loki/)\n     \u003e База данных для логов на базе Prometheus-like хранилищах с хорошей интеграцией с Grafana.\n1. [Prometheus](https://prometheus.io/) или подобные, например, [Victoria Metrics](https://victoriametrics.com/) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   \u003e Популярная система сбора и хранения метрик.\n   * Типы метрик \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * count\n     * gauge\n     * histogram\n     * summary\n   * Варианты отправки метрик: push и pull \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * Запросы (лучше и наглядней делать из Grafana) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * [Синтаксис](https://prometheus.io/docs/prometheus/latest/querying/basics/) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * Лейблы\n     * Векторы\n     * Интервалы\n     * Операторы\n   * [Функции](https://prometheus.io/docs/prometheus/latest/querying/functions/), особенно стоит выделить 2 из них: \u003ckbd\u003emiddle\u003c/kbd\u003e\n     * rate\n     * irate\n1. Grafana \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   \u003e Отличный UI для отображения метрик из разных систем хранения, включая Prometheus-like системы.\n   * Создание дашбордов\n   * Создание графиков\n   * Настройка алертов\n\n# Этап 12. Проектирование и разработка\n\nПаттерны, концепции и подходы к проектированию различных web-приложений.\n\n1. Принципы разработки \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * GRASP (General Responsibility Assignment Software Patterns) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * [SOLID](https://blog.byndyu.ru/2009/10/solid.html) (Single Responsibility, Open–Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * KISS (Keep It Simple, Stupid) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * YAGNI (You Aren't Gonna Need It) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * DRY (Don’t Repeat Yourself) \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * [IoC](https://habr.com/ru/post/321344/) (Inversion Of Control), и как следствие — DI (Dependency Injection) \u003ckbd\u003emiddle\u003c/kbd\u003e\n   * DDD (Domain-Driven Design) \u003ckbd\u003emiddle\u003c/kbd\u003e\n1. Архитектурные шаблоны \u003ckbd\u003ejunior\u003c/kbd\u003e\n   \u003e В одном проекте может быть один или несколько архитектурных шаблонов, или даже половина. Архитектурные шаблоны - подход к решению задачи, которую возложили на проект.\n   * Гексагональная архитектура \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * [Event-Driven Architecture](https://habr.com/ru/post/346630/) (aka Шаблон посредника или Broker pattern) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Onion Architecture (аkа Луковая архитектура или Многоуровневый шаблон) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * CQRS (The Command and Query Responsibility Segregation) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * SoA (Service-Oriented Architecture) \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Event Sourcing \u003ckbd\u003emiddle+\u003c/kbd\u003e\n   * Шаблон MVC \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Самый старый и достаточно распространённый шаблон проектирования приложения, разделяющий UI от логики приложения.\n   * [Шаблон ADR](https://habr.com/ru/post/260769/) (Action-Domain-Responder)\n     \u003e Доработка MVC под задачи веба\n   * Шаблон MVP \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e MVP - итерация развития MVC из-за усложнений приложений и UI. Часто используется во front-end - в браузере.\n   * Шаблон [MVVM](https://habr.com/ru/company/mobileup/blog/313538/)\n     \u003e На самом деле этот шаблон подходит для десктопных или мобильных приложений. В web приложениях практически не используется.\n1. [Шаблоны проектирования](https://refactoring.guru/ru/design-patterns/examples)\n   \u003e Шаблоны упрощают разработку, так как это, по сути, опыт сообщества по решению тех или иных проблем. \n   \u003e Главное не забывайте про KISS и YAGNI, чтобы не упасть в ад абстракций и пучину сложности.\n   * Порождающие шаблоны проектирования\n   * Структурные шаблоны проектирования\n   * Поведенческие шаблоны проектирования\n1. Методологии разработки\n   \u003e Это не про scrum, agile, waterfall, планирование, проектирование и прочее. Это про методологии написания кода.\n   * [TDD](https://habr.com/ru/company/ruvds/blog/450316/) (Test Driven Development)\n     \u003e Разработка через тестирование, самый известный способ разработки, требующий от разработчика сначала - написание теста к коду, а потом самого кода.\n   * BDD (Behavior Driven Development)\n     \u003e Расширенная версия TDD, тем что сперва пишется не тест, а описание что нужно сделать, на предметном языке, например Gherken.\n1. [Типы приложения](https://dou.ua/forums/topic/31720/)\n   \u003e Существует разделение приложения по способу генерации UI.\n   * MPA (Multi-Page Application)\n     \u003e Классический тип приложения, с несколькими страницами генерируемыми на back-end для создания UI.\n   * SPA (Single Page Application)\n     \u003e Общее название типа приложения когда приложение живёт в браузере и ходит за данными на сервер. Может быть как SSG, SSR, CSR или любое их сочетание.\n   * SSG (Static Site Generation)\n     \u003e Все страницы приложения заранее генерируются в статичные файлы. Динамика полностью на JS. Может быть как и MPA так и SPA.\n   * SSR (Server Side Rendering)\n     \u003e Подход к генерации страниц приложения. Каждый запрос обрабатывается на сервере, где генерируется UI, а после сервер возвращает ответ клиенту на front-end.\n   * CSR (Client Side Rendering)\n     \u003e Подход к генерации страниц приложения. Весь UI генерируется в браузере при помощи JS. JS делает запросы на сервера за данными, для построения или изменения UI. \n     \u003e SPA — частный случай CSR.\n   * PWA (Progressive Web Application)\n     \u003e Буквально ваш сайт в виде мобильного приложения.\n1. Тестирование. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Unit тестирование \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Тестирование отдельных (в том числе отдельных друг от друга) частей продукта, обычно отдельных функций/методов.\n     \u003e Unit-тесты так же несут ещё одну цель - проверка архитектуры вашей реализации.\n     \u003e Как правило, если у вас не получается написать unit-тест на функцию/метод, не вовлекая сторонние компоненты приложения\n     \u003e то возможно стоит пересмотреть архитектуру. Хорошее Unit-тестирование ведёт к хорошей инверсии контроля (IoC, см. выше)\n   * Интеграционные тесты \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Сложный вид тестов. Проверка работоспособности приложения, модуля, компонентом с другим приложением, модулем, компонентом. \n   * End-to-End (aka E2E aka Сквозное тестирование) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Пример E2E теста - тестирование готового API приложения. Тестируются не компоненты приложения, а готовая функциональность.\n   * Smoke test (aka дымовые тесты) \u003ckbd\u003emiddle\u003c/kbd\u003e\n     \u003e Дымовые тесты позволяют протестировать саму возможность работать вашему приложению. \n     \u003e Иногда используют для тестирования инфраструктуры на возможность работать в ней вашему приложению.\n1. Проблемы приложений и проектирования. \u003ckbd\u003ejunior\u003c/kbd\u003e\n   * Технический долг. \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Тех.долг начнёт копиться в проекте с первых строк кода. Всегда стоит его учитывать в разработке и планировать его устранение.\n   * Over engineering \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Когда реализация намного больше или сложнее чем требуется. Потребует кучу ресурсов на поддержку проекта.\n   * Преждевременная оптимизация (aka Premature Optimization) \u003ckbd\u003ejunior\u003c/kbd\u003e\n     \u003e Прибегание к оптимизации там где она не требуется на данный момент. Отнимет кучу ресурсов на этапе разработки проекта.\n1. [Приёмы рефакторинга](https://refactoring.guru/ru/refactoring/techniques)\n   \u003e Чтобы избавляться от тех.долга придётся часто и много рефакторить.\n1. [Антипаттерны](https://ru.wikipedia.org/wiki/Антипаттерн)\n   \u003e Полезно знать как следует делать, но не менее полезно знать как НЕ следует делать.\n1. [Semver](https://semver.org/lang/ru/)\n   \u003e Самый распространённый принцип наименования версий приложения. В некоторых языках и пакетных менеджерах является обязательным к соблюдению.\n1. Распределенные системы\n   \u003e Когда приложение упирается в потолок сервера то у вас только один выход - заставить приложение работать на нескольких серверах.\n   \u003e Это сильно усложняет приложение и много ресурсов уходит на сохранение целостности и согласованности данных.\n   * [Теоремы CAP и PACELC](https://habr.com/ru/company/gaz-is/blog/551986/)\n     \u003e В распределённых системах придётся чем-то жертвовать. PACELC - расширенная теорема CAP.\n     \u003e Эти теоремы как раз описывают какими параметрами придётся пожертвовать системе.\n   * [Микросервисная архитектура](https://habr.com/ru/company/dataart/blog/280083/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbzick%2Foh-my-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbzick%2Foh-my-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbzick%2Foh-my-backend/lists"}