Créé par l'IAAmélioré par les gens

Riqli · documents vivants · mis à jour en continu

Là où le savoir de l'IA rencontre la pratique humaine.

Partager avec des amis
image

Материал библиотеки. Hard skill. (Java. Node. NET. Python. Tutorial. Practice. Standard.)

sections

Введение: Production-разработка на Java / Go / Node / .NET / Python

contents

Аннотация. Курс посвящён практической работе с пятью ключевыми стеками backend-разработки на уровне production: Java (Spring Boot), Go (Gin/Echo/Fiber), Node.js (NestJS/Express/Fastify), .NET (ASP.NET Core 8) и Python (FastAPI/Django). Материал построен на реальных требованиях к надёжности, наблюдаемости, безопасности и производительности сервисов, а не на синтетических примерах.

Цель. Сформировать у инженера способность выбирать стек под конкретный профиль нагрузки, выстраивать production-ready pipeline (сборка, тестирование, деплой), обеспечивать изоляцию отказов и понимать компромиссы между скоростью разработки, стоимостью владения и характеристиками runtime.

Результаты обучения. По завершении курса вы сможете: обоснованно выбирать язык и фреймворк под тип нагрузки (I/O-bound, CPU-bound, burst); настраивать middleware-цепочки и RFC 7807 обработку ошибок; проектировать конфигурацию для холодных стартов в serverless; применять .gitignore-шаблоны для каждого стека; оценивать влияние выбора языка на скорость AI-ассистированной разработки.

Целевая аудитория. Backend-инженеры уровня middle и выше, tech leads, архитекторы, принимающие решения о стеке для production-систем. Предполагается знание Git, базовое понимание HTTP и знакомство хотя бы с одним из пяти языков.

sections

Раздел 1. Выбор языка под профиль нагрузки: production-критерии

contents

I/O-bound и real-time: Node.js. Node.js использует событийно-ориентированную неблокирующую модель ввода-вывода, что делает его эффективным для API с высокой конкурентностью подключений, real-time чатов, стриминга и сервисов с частыми обращениями к внешним ресурсам (БД, кэш, очередь). Единый JavaScript-стек упрощает full-stack разработку и ускоряет итерации. Ограничение: однопоточная модель плохо масштабируется на CPU-интенсивных задачах (шифрование, обработка медиа, сложные вычисления), где event loop становится узким местом .

CPU-bound и data-heavy: Java и .NET. Java (Spring Boot) остаётся стандартом для enterprise-систем с жёсткими требованиями к транзакционности, аудиту, ролевой модели и интеграции с legacy. Annotation-driven security и audit logging в Spring Boot формируют основу для SOC 2 и HIPAA . .NET (ASP.NET Core 8) даёт сопоставимую производительность, особенно в сценариях с Windows/Azure-инфраструктурой и Active Directory. Ограничение Java — длительный прогрев JIT: в задачах с burst-нагрузкой или serverless холодные старты могут занимать 800–2000 мс против 200–400 мс у Node.js и Go .

contents

Concurrency и cloud-native: Go. Go компилируется в нативный код, обеспечивает предсказуемый холодный старт (250–400 мс), эффективную работу с горутинами и каналами. Это делает его предпочтительным для микросервисов, требующих высокой пропускной способности при низком потреблении памяти, и для сервисов, где важна плотность развёртывания (Kubernetes, serverless). Ограничение: экосистема специалистов по Go уже, чем по Node или Python, что увеличивает стоимость найма .

Rapid development и AI/ML: Python. Python (FastAPI, Django) выигрывает в скорости разработки MVP, богатстве библиотек для data science и машинного обучения. FastAPI с Pydantic обеспечивает автоматическую валидацию и генерацию OpenAPI. Однако интерпретируемая природа и GIL ограничивают CPU-bound параллелизм; в бенчмарках с чисто вычислительной нагрузкой Python стабильно показывает высокие задержки . Для production FastAPI с async-поддержкой остаётся приемлемым выбором в I/O-интенсивных сценариях, но требует внимательного профилирования.


questions

Для какого типа нагрузки Node.js демонстрирует наибольшее преимущество в production?

réponsesCorrect

I/O-bound нагрузки с высокой конкурентностью подключений

explications

Событийно-ориентированная неблокирующая модель ввода-вывода позволяет Node.js эффективно обслуживать множество одновременных соединений без создания потока на каждое, что даёт преимущество именно в I/O-bound сценариях.

réponsesIncorrect

CPU-bound задачи с интенсивными вычислениями

réponsesIncorrect

Сценарии с длительным прогревом JIT-компилятора

réponsesIncorrect

Задачи, требующие максимальной плотности памяти на инстанс


questions

Какое ограничение Java делает её менее подходящей для serverless и burst-нагрузок по сравнению с Go и Node.js?

réponsesCorrect

Длительный прогрев JIT-компилятора и высокое время холодного старта

explications

JVM требует времени на загрузку классов, JIT-компиляцию и оптимизацию горячих путей. В serverless, где инстанс создаётся на каждый запрос или при масштабировании, это приводит к задержкам в сотни миллисекунд и более, что критично для latency-sensitive сценариев.

réponsesIncorrect

Отсутствие поддержки многопоточности

réponsesIncorrect

Невозможность работы с реляционными базами данных

réponsesIncorrect

Отсутствие кроссплатформенности

sections

Раздел 2. Production pipeline: .gitignore, сборка, деплой

contents

Синтаксис .gitignore, который нужно знать наизусть. Git читает .gitignore построчно. Паттерн * соответствует любому количеству символов в имени файла (кроме /). Паттерн ** соответствует любому количеству директорий рекурсивно. Паттерн ! отменяет предыдущее правило, но не работает, если родительская директория уже проигнорирована: если build/ в игноре, то !build/keep-me.txt не сработает, пока не будет добавлено !build/ .

Шаблоны для пяти стеков. Python: __pycache__/, *.pyc, .venv/, .env. Node.js: node_modules/, dist/, .env, npm-debug.log*. Java: target/ (Maven), build/ (Gradle), *.class. Go: бинарники в корне (если собираются локально), vendor/ при выборе стратегии vendoring, .env. .NET: bin/, obj/, *.user, .vs/. Глобальный ~/.gitignore_global избавляет от повторения правил для IDE и ОС в каждом проекте .

Уже закоммиченные файлы. Если артефакт уже в индексе, .gitignore на него не действует. Используйте git rm --cached <file> для удаления из индекса без удаления с диска. Для пустых директорий, которые должны отслеживаться, используйте .gitkeep .


questions

Почему паттерн !build/keep-me.txt не сработает, если в .gitignore уже есть строка build/?

réponsesCorrect

Git не применяет отменяющие правила к файлам внутри уже проигнорированной директории

explications

Правило ! имеет силу только для путей, которые Git ещё рассматривает. Если директория build/ уже полностью исключена, Git не заходит внутрь неё для проверки дочерних паттернов. Сначала нужно разрешить саму директорию (!build/), а затем уже конкретный файл.

réponsesIncorrect

Синтаксис ! не поддерживается в Git для файлов, только для директорий

réponsesIncorrect

Паттерн !build/keep-me.txt требует экранирования слеша

réponsesIncorrect

Git читает .gitignore в обратном порядке, и правило build/ перезаписывает исключение


questions

Какая команда убирает файл из индекса Git, но оставляет его на диске?

réponsesCorrect

git rm --cached <file>

réponsesIncorrect

git delete --keep <file>

réponsesIncorrect

git ignore --remove <file>

réponsesIncorrect

git reset --hard <file>

sections

Раздел 3. Middleware, ошибки и API-контракты в production

contents

Порядок middleware — это контракт. В production-ready API обработка запроса должна следовать строгой цепочке: request ID → CORS → rate limit → auth → валидация → handler. Нарушение порядка создаёт уязвимости: если rate limit стоит после auth, неаутентифицированные запросы могут исчерпать ресурсы; если CORS после auth, preflight-запросы могут блокироваться некорректно. Request ID должен генерироваться в самом начале для сквозной корреляции логов .

RFC 7807 Problem Details. Все ошибки в production-сервисе должны возвращаться в едином формате RFC 7807: type, title, status, correlationId. Это позволяет клиентам и шлюзам обрабатывать ошибки единообразно и не парсить свободный текст. Никогда не возвращайте stack traces, имена таблиц БД, внутренние пути или детали инфраструктуры — только безопасное сообщение и correlationId для поиска в логах .

Framework selection и AI-ассистированная разработка. Типизированные фреймворки (NestJS, FastAPI, ASP.NET Core) выигрывают при использовании AI-генерации кода: наличие явных типов, DI-контейнера и декораторов даёт модели структурный контекст, повышая точность генерации. В неаннотированных Python-файлах acceptance rate предложений Copilot составляет около 47%, тогда как в типизированных — около 60%. Выбор слаботипизированного фреймворка ради простоты онбординга может замедлить AI-ассистированную разработку на масштабе .


questions

Где в цепочке middleware должен находиться request ID?

réponsesCorrect

В самом начале, до CORS, rate limit и auth

explications

Request ID нужен для сквозной трассировки всех последующих операций, включая логирование ошибок аутентификации, rate limit и валидации. Если он генерируется позже, часть запроса остаётся без корреляционного идентификатора.

réponsesIncorrect

После auth, но до валидации

réponsesIncorrect

Внутри handler, непосредственно перед бизнес-логикой

réponsesIncorrect

После CORS, для корреляции preflight-запросов


questions

Какой стандарт определяет формат Problem Details для HTTP-ошибок?

réponsesCorrect

RFC 7807

réponsesIncorrect

RFC 2616

réponsesIncorrect

RFC 7519

réponsesIncorrect

RFC 9110

contents

Уже закоммиченные файлы. Если артефакт уже в индексе, .gitignore на него не действует. Используйте git rm --cached <file> для удаления из индекса без удаления с диска. Для пустых директорий, которые должны отслеживаться, используйте .gitkeep.

Проверка правил игнорирования. Для отладки, почему файл игнорируется, служит команда git check-ignore -v <path> — она покажет, какой именно паттерн из какого .gitignore сработал . Посмотреть все игнорируемые файлы позволяет git status --ignored . Если нужно добавить файл принудительно, используйте git add -f <file> .

Глобальный gitignore. Файл ~/.gitignore_global избавляет от дублирования правил для IDE, ОС и редакторов в каждом проекте. Типичное содержимое: .DS_Store, Thumbs.db, *~, *.swp, *.swo. Настроить его можно командой git config --global core.excludesfile ~/.gitignore_global.


questions

Какая команда позволяет проверить, какой именно паттерн игнорирует конкретный файл?

réponsesCorrect

git check-ignore -v <path>

explications

Флаг -v выводит детальную информацию: путь к файлу, номер строки и сам паттерн, который сработал. Это основной инструмент отладки правил игнорирования .

réponsesIncorrect

git status --ignored

réponsesIncorrect

git add -f <path>

réponsesIncorrect

git config --global core.excludesfile