Документ содержит список базовых навыков, которые часто требуются backend разработчику web-приложений.
Метка ⚡ означает что этот пункт для более глубокого и продвинутого изучения темы (если у Вас есть время).
Каждый пункт подразумевает что:
- бекендер знает что это и какую проблему решает.
- бекендер знает для чего и когда следует применить.
- бекендер знает как с этим работать или знает где подсмотреть.
- при разработке или проектировании бекендер помнит про них и учитывает в приложении.
Как это работает "внутри" будет дополнительным бонусом в понимании темы. Если разбираться как работает "внутри" каждый пункт то потребуется очень много времени на изучение, как следствие изучайте по желанию и необходимости.
Каждый пункт легко гуглится и имеет страницу в wikipedia. Ссылки устанавливаются если есть альтернативная документация - более понятная и/или подробная. Ссылка на вики ставятся что бы исключить ошибочного варианта статьи на вики.
- Этап 1. Виртуализация docker
- Этап 2. Linux
- Этап 3. Общие знания
- Этап 4. Сеть
- Этап 5. Базы данных
- Этап 6. Протокол HTTP
- Этап 7. Безопасность
- Этап 8. Тут должен быть ваш язык программирования
- Этап 9. Электронная почта
- Этап 10. Полнотексовый поиск через ElasticSearch
- Этап 11. Метрики
Для начала надо поднять виртуальную машину для экспериментов и изысканий. Даже если уже имеет Linux на рабочей машине, всё равно поднимите виртуализацию. В случае чего, виртуальную машину всегда можно пересоздать.
- установить docker
- запустить контейнер с Linux Ubuntu, последней LTS версией. Запустить bash контейнера.
- установить удобное приложение для урпавления образами и контейнерами Kitematic, Portainer и тд. Либо сродниться с консольными командами docker
- ⚡ docker compose для поднятия кластера контейнеров
Изучить установленый в контейнере Linux из этапа 1. Linux де-факто является серверной ос для большинства случаев web-приложений.
- Установка пакетов и обновление системы через
apt
/apt-get
/aptitude
- Базовые навыки в bash
- Базовый синтаксис bash
- Управляющи операторы
for
иif
- Логические
;
,&&
,||
- Управляющи операторы
- Базовые команды
cd
,ls
,find
,cat
,top
/htop
,cp
,mv
. - Команды обработки данных
tail
,head
,sed
,grep
,awk
. - Команды работы с архивами
gzip
,gunzip
,tar
,zcat
,zless
,zgrep
- Консольные редакторы
vim
/vi
,nano
. Откыть файл, внести изменения, сохранить. - Консольный просмоторщик
less
. Открыть, найти слово, закрыть. - Конвееры команд через оператор
|
:cmd1 | cmd2 | cmd3
- Фоновые задачи, оператор
&
, командыjobs
,fg
,bg
- Перенаправление потоков, операторы
>
,>>
,<
- Базовый синтаксис bash
- Понятие
процесс
- Родительский процесс, дочерний процесс.
- Мастер-воркер процессы, демон (daemon)
- Зомби процесс. Откуда берутся, как с ними бороться.
- Отправка сигналов процессам
- Команада анализа работы процесса через
strace
- Изучение понятия
дескриптор
- Стандартные дескрипторы
STDIN
,STDOUT
,STDERR
и их нумерация вshell
-ах - Ограничение на дескрипторы
- Потоки, сокеты и unix-сокеты
- Команада анализа открытых дескрипторов у процесса через
lsof
- Стандартные дескрипторы
- Права и доступы файловой системы
- Супер пользователь, команды
su
иsudo
- Флаги доступов
x
,r
,w
(что они значат для файлов и директорий) - Понимание описания доступов вида
--xr-xrwx
и0137
(восмеричная) у файлов и директорий - Изменение прав доступов через команды
chmod
,chown
- Супер пользователь, команды
- Исполняемые файлы
- Запуск и остановка сервисов systemd
- SSH
- Генерация собственного ssh-rsa ключа
- Использование публичного ssh-rsa ключа для входа на удалённую машину (используйте второй контейнер с linux).
- Перенос контента (помимо
cp
иmv
)scp
rsync
- Планировщик задач
crond
/crontab
,at
Некоторые знания не возможно категоризировать. Но без них не обойтись.
- Регулярные выражения. Поиграться регулярными выражениями можно тут. Хоть каждый язык может иметь своё видение регулярных выражений, в общем смысле (и синтаксисе) они похожи.
- Криптография
- Хеши и хеш функции, в том числе
crc32
,md5
,sha1
,sha256
. Цифровые подписи, соль для подписей, коллизии хешей. - Симметричное и асимметричное шифрование.
- Алгоритмы шифрования.
- SSL и TLS.
- Хеши и хеш функции, в том числе
- Базовая работа с
git
- комит изменений (commit)
- отправка изменений (push/pull)
- создание веток и тега (branch/tag)
- ⚡ упороться полностью git-ом
- Стуктуры хранения данных
- Хеш таблицы
- Очередь и стек
- Связный список и двусвязный список
- Бинарное дерево
- Форматы хранения и передачи данных
- Текстовые
- JSON
- YAML
- XML
- Бинарные
- MessagePack
- BSON
- ProtoBuf
- Текстовые
Сеть в разработке самая важная и, часто, мало заметная часть.
- Базовое понимание работы сети, протокл TCP и протокл UDP.
- TCP пакет, UDP пакет
- TCP:
- ⚡ Флаги ACK, SYN, FIN и прочие
- Window size
- ⚡ Сетевые издержки: Pocket loss, Reordering, Jitter, Round-Trip Time (RTT aka ping aka лаг)
- проблемы TCP
- IPv4, IPv6
- DNS
- Как работает резолвинг доменов
- DNS записи
- Основные MX, CNAME, NS, A, AAAA, TXT
- ⚡ Прочие записи
- Консольные команды работы с доменами: whois, dig, host
- Трассировки маршрутов.
- ⚡ анализ трафика через tcpdump + wireshark
Без баз данных - никуда. Самая частый вид баз данных - реляционные.
- SQL базы данных MySQL/Postgres/итд. MySQL подразумевает как MySQL от Oracle, так и различные модификации как MariaDB, Percona XTraDB
- Базовый синтаксис запросов
SELECT
/INSERT
/UPDATE
/DELETE
- Создание и модификация таблиц
- Типы колонок таблиц их назначение их различие (на примере MySQL и схожих)
- tinyint/smallint/int/bigint
- tinytext/text/mediumtext/longtext
- set/enum
- char/varchar
- decimal
- double
- прочие
- Создание и применеие ALTER запросов.
- Типы колонок таблиц их назначение их различие (на примере MySQL и схожих)
- Анализ выполнения запросов через
EXPLAIN
, понимание результатовEXPLAIN
. - Ведение логов медленных запросов — slow_log.
- Понимание работы индексов
- Назначение PRIMARY индексов
- Назначение UNIQUE/обычный индексов
- Составные индексы.
- Понимание какие поля в какой последовательности добавлять в индекс при фиьтрации и сортировке одновременно.
- ⚡ Алгоритм построения индексов
BTREE
- Объединение таблиц
LEFT JOIN
,RIGHT JOIN
,INNER JOIN
,OUTER JOIN
,JOIN
- Группировка данных через
GROUP BY
- Фильтрация после группировки
- Функции работы с группами MAX/MIN/AVG/итд
- Понимание и назначение внешних ключей (
foreign key
) - Транзакции
- Уровни изоляций транзакций
- Deadlock и как его не допускать
- ⚡ Триггеры на
INSERT
/UPDATE
/DELETE
- Хранение деревьев
- parent-child
- nested sets
- Базовый синтаксис запросов
- noSQL базы данных MongoDB/DocumentDB
- Типы колонок таблиц их назначение их различие
- Анализ выполнения запросов через
explain()
, понимание его результатов. - Понимание работы индексов (аналогично SQL индексам с небольшими отличиями)
- Вложенные объекты, массивы.
- ⚡ Аггрегации
- Redis
- базовая работа с ключами
- работа со списками
- работа с хешами
- работа с набором и сортированным набором
- ⚡ Структура хранения данных skip list
Каждый WEB разработчик должен понимать протокол HTTP. Разработчик который не знает HTTP протокол — это как сапожник без сапог.
- Понимание общего формата протокола: где заголовки, а где тело.
- Сродниться со вкладкой Сеть/Network в инспекторе браузера, где можно наблюдать HTTP запросы.
- Методы HTTP запросов. Их назначение и ограничения.
- Коды HTTP ответов
- Основные (частые): 200, 301, 302, 304, 400, 401, 403, 404, 500, 502, 503, 504
- Другие
- Заголовки HTTP запроса
- MIME тип (тип документа) и заголовок типа Content-Type.
- Системные заголовоки Host, Content-Length
- Кеширование HTTP и изучение HTTP заголовков упарвления кешом Cache-Control, Expires, Vary, ETag, Last-Modified
- Куки
- Cross-Origin Resource Sharing (CORS)
- Content-Security-Policy (CSP)
- Различия версий протокола HTTP/1.0, HTTP/1.1
- Тело HTTP запроса
- Формат передачи
application/x-www-form-urlencoded
- Формат передачи multipart/form-data
- Влияние заголовков (Content-Length, Content-Encoding, Transfer-Encoding) на тело
- Формат передачи
- Консольные команды HTTP запросов
curl
,wget
- ⚡ HTTP/2.0 протокол и HTTP/3.0
- ⚡ WebSocket протокол
- HTTP API форматы
- Web сервера
- Nginx. Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - велика.
- Ознакомление с базовыми возможностями
- ⚡ Масштабируемая конфигурация nginx
- Написание простых локаций в
/etc/nginx/nginx.conf
раздачи файлов - HTTP, FastCGI проксирование
- Nginx. Самый распространённый Web-сервер. Вероятность натолкнуться на него во время разработки web-приложения - велика.
- Виды управления доступом
- ACL
- RBAC
- Аутентификация
- Basic
- OAuth
- Ldap
- Виды атак
- Фишинг сайта
- Инъекции (включая SQL-иньекции)
- XSS акака
- HTTP DDOS
- Медленный POST/PUT/другой запрос с телом запроса
- ⚡ SYN flood
Языков программирования большое множество. Поэтому этот этап будет задевать только часто встречающиеся вопросы в большинстве популярных языков программирования. Принцип работы с этим разделом: гуглите %ваш_язык_программирования% %пункт_из_этапа%
- Что такое интерпертатор, компилятор, JIT, оп-код, байт-код. Что из этого использует ваш язык?
- Ваш язык программирования
- Базовые (примитивные) типы данных в языке
- Объекты/классы/прототипы
- Преобразование типов
- Слабая/сильная типизация в коде (если есть). На что влияет и как с этим жить.
- Проблемы в коде
- Бесконечные циклы
- Рекурсии
- Ошибка сегментирования (и ее связь с сигналом SIGSEGV)
- Распараллеливание
- Различие процессов (созданные через fork) от потоков (thread)
- Поведение дескрипторов до и после fork
- Потоки (threads)
- Зелёные потоки (Green threads)
- Race Condition
- Блокировки Mutex и Семафоры
- Процессы
- Разделяемая память (Shared memory)
- Межпроцессное взаимодействие (IPC)
- Корутины
- Различие процессов (созданные через fork) от потоков (thread)
- Битовые операции: not, and, or, xor, сдвиг влево, сдвиг вправо
- Кеширование данных
- Частые алгоритмы кеша LRU, LFU
- ⚡ Иные алгоритмы кеширования
- Прогревание кеша, инвалидация кеша
- Сессии (пользователей)
- Как инициировать
- Где храняться
- Параллельное использование одной сессии несколькими запросами
- Принципы программирования
- KISS
- IoC
- Юнит тестирование
- Ознакомление с системой тестирования в вашем языке
- Test-Driven Development (TDD)
- Специфика работы IO (сокетов, дескрипторов, потоков)
- Буфферы IO
- Асинхронный IO (если доступен)
- Работа с Last-Modified + 304
Работа с эл. письмами неотъемлемая часть web разработки (да и не только). Если не придется создавать письма вручную то читать "сырое" письмо придется.
- Протоколы передачи почты POP3, IMAP
- Спецификация письма MIME
- Основные заголовки:
Return-Path
,Received
,From
,To
,Cc
,Bcc
,Reply-To
,Subject
,Message-ID
- прочие заголовки
- указание кодироквки
- кодирование полей и тела в base64
- Основные заголовки:
Каждый разработчик сталкивается с необходимостью полнотекстового поиска, да и вцелом быстрого поиска по куче аттрибутов и текстов. Для этого используются различные полнотекстовые поисковые движки такие как ElasticSearch, SphinxSearch, ManticoreSearch и тд. Самый распространненый полнотексовый поисковый движок с большим комунити — ElasticSearch.
- Индексы. Как с ними работать и их ограничения.
- Базовые запросы
- Запросы поиска
- Запросы добавления/обновления документов, включая bulk
- Подключение морфологий
- mapping и их шаблоны
- ⚡ аггрегации и их кешировани
- ⚡ шардинг
- работа с nested-документами
- ⚡ ELK
Любое приложение должно уметь генерировать полезные метрики для система сбора и анализа метрик. По факту сейчас среди opensource акуален Prometheus для сбора и анализа метрик и Grafana для их отображения и алертов.