TODO: Roadmap¶
1. Requirements Engineering¶
-
Инициация сбора требований 1.1. Определение целей и контекста проекта 1.2. Идентификация стейкхолдеров 1.3. Сбор исходных документов и бизнес-описаний
-
Выявление требований (Elicitation) 2.1. Интервью с заказчиком и пользователями 2.2. Анкеты, опросы, фокус-группы 2.3. Наблюдение за текущими процессами (shadowing) 2.4. Workshop / JAD-сессии
-
Анализ и категоризация 3.1. Разделение на функциональные (FR) и нефункциональные (NFR) требования 3.2. Приоритизация (MoSCoW, Kano) 3.3. Уточнение бизнес-правил и ограничений
-
Моделирование требований 4.1. Use Case-диаграммы (UML) 4.2. User Story Mapping / Story Board 4.3. BPMN / Activity Diagrams
-
Документирование в SRS 5.1. Введение и Scope 5.2. FR: описание сценариев с уникальными ID 5.3. NFR: производительность, безопасность, масштабируемость 5.4. Интерфейсы: UI, API, Hardware, Network 5.5. Бизнес-правила и допущения
-
Валидация и согласование 6.1. Review-сессии с заказчиком 6.2. Прототипы / Mock-up 6.3. Финальное утверждение SRS
-
Управление требованиями 7.1. Версионирование SRS 7.2. Обработка Change Requests 7.3. Traceability Matrix (связь требований → дизайн → тесты)
2. System Design¶
-
Подготовка и входные данные 1.1. Утверждённые FR/NFR из SRS 1.2. Технические ограничения и предпосылки 1.3. KPIs: RPS/QPS, latency, SLA
-
High-Level Architecture 2.1. Выбор стиля: монолит ↔ микросервисы ↔ SOA 2.2. Слоистая архитектура (Presentation, Business, Data) 2.3. C4 Model: Context & Container Diagrams 2.4. Разграничение Bounded Contexts (DDD)
-
Компоненты и интеграция 3.1. API Gateway, Load Balancer 3.2. Базы данных: SQL vs NoSQL, репликация, шардирование 3.3. Кэш (Redis/Memcached), CDN 3.4. Messaging (Kafka, RabbitMQ)
-
Нефункциональные решения 4.1. Масштабируемость: горизонтальная vs вертикальная 4.2. Отказоустойчивость: Health Checks, Failover, Replicas 4.3. Безопасность: TLS, OAuth2/JWT, WAF 4.4. Производительность: кеширование, CDN, тонкие клиенты
-
Detailed Design 5.1. UML-диаграммы классов и последовательностей 5.2. ER-диаграмма базы данных, индексы 5.3. Проектирование API (REST/GraphQL/gRPC) 5.4. Стратегии кеширования и обработки ошибок (retry, circuit breaker)
-
Инфраструктура и деплой 6.1. Docker-контейнеризация, Dockerfile 6.2. Оркестрация: Kubernetes / Docker Swarm 6.3. CI/CD pipeline: build → test → deploy → rollback 6.4. Мониторинг и логирование (Prometheus, ELK, Grafana)
-
Верификация дизайна 7.1. PoC / Spike solutions для критичных компонентов 7.2. Архитектурные ревью (ADR) 7.3. Нагрузочное и security-тестирование
3. Project Management¶
-
Инициация проекта 1.1. Project Charter (цели, обоснование) 1.2. Определение стейкхолдеров 1.3. Ключевые риски и допущения
-
Планирование 2.1. Scope Definition & WBS 2.2. Оценка ресурсов и сроков (PERT, Delphi, Expert Judgment) 2.3. График: Gantt Chart, Critical Path Method 2.4. Бюджет и план закупок 2.5. Risk Management Plan 2.6. Communication Plan
-
Исполнение 3.1. Team Formation & Roles (PO, PM, Dev Team) 3.2. Управление ресурсами и задачами (Task Tracking) 3.3. Code Review & QA практики 3.4. Управление изменениями (Change Requests)
-
Мониторинг & контроль 4.1. Earned Value Management (EV, PV, AC, SPI, CPI) 4.2. Status Reporting (Dashboards, Status Reports) 4.3. Управление рисками (Risk Register обновления) 4.4. Quality Control (тестирование, инспекции)
-
Закрытие проекта 5.1. Acceptance Testing и передача продукта 5.2. Lessons Learned / Post-mortem 5.3. Архивация документации 5.4. Закрытие контрактов и освобождение ресурсов
Java: темы к разбору¶
Многопоточность¶
- Многопоточность. Класс Thread, интерфейс Runnable. Модификатор synchronized интерфейсы Lock и Condition
- Классы-сихронизаторы из пакета java.util.concurrent
- Модификатор volatile. Атомарные типы данных и операции
- Коллекции из пакета java.util.concurrent
- Интерфейсы Executor, ExecutorService, Callable, Futur
- Пулы потоко
Паттерны¶
- Шаблоны проектирования: Decorator, Iterator, Factory method, Command, Flyweight, Interpreter, Singleton, Strategy, Adapter, Facade, Proxy
- GRASP & GoF Design patterns
- Enterprise Patterns
Сети: темы к разбору¶
Контекст. Keenetic Giga не тянет то, что нужно для работы. Клиент Xray для VLESS ставится только через сторонний XKeen поверх Entware и ломается после обновлений прошивки. Маршрутизация по доменам в разные VPN слабая: DNS-маршруты только добавляют маршруты, политика одна на устройство, GeoIP нет. Веб-админка подходит для дома, для работы нет. Вопрос - закроет ли это корпоративное железо: MikroTik, Cisco, стоечные маршрутизаторы и коммутаторы.
Предварительный вывод из разбора 18.10.2026: VLESS и «домен → нужный VPN» решает не класс железа, а прокси-движок
на Linux (sing-box, Xray). Cisco, Juniper и Eltex этого не умеют вообще. MikroTik даёт профессиональную сеть: VLAN,
несколько таблиц маршрутизации, CLI с /export. Xray на нём живёт только в контейнере. Рабочая схема - Linux-шлюз
с sing-box для прокси и MikroTik или Keenetic для самой сети.
Основы¶
- Чем отличается маршрутизатор от коммутатора. Частично есть в network-devices, разделы «Маршрутизатор» и «Сравнение» - проверить и дополнить
- Разница L2 и L3 коммутатора. В network-devices пока два пункта в «Виды коммутаторов» и таблица L3-коммутатор против маршрутизатора - расписать отдельно: что добавляет L3 (SVI, маршрутизация между VLAN в ASIC, ACL, статика и OSPF), что такое L2+ и L3-lite
Корпоративное железо против домашнего¶
- Keenetic против MikroTik, Cisco, Eltex, OpenWrt и Linux-шлюза: что умеет каждый, как управляется, что с поддержкой в РФ
- Что умеет корпоративный маршрутизатор: несколько таблиц маршрутизации, policy-based routing, BGP и OSPF, полноценный firewall, несколько каналов с переключением, QoS, NetFlow
- Что умеет управляемый коммутатор: VLAN-транки, LACP, PoE-бюджет, STP, зеркалирование портов, 802.1X, SFP+
- Интерфейсы управления: WinBox, WebFig и CLI RouterOS,
/exportв git, REST API, CLI Cisco IOS, Ansible - Стоечное железо MikroTik: маршрутизаторы CCR и RB5009, коммутаторы CRS326 и CRS328 с PoE
Маршрутизация по доменам и прокси¶
- Почему маршрутизация по доменам на роутере неточная: CDN на общих IP, DoH мимо роутера, устаревшие адрес-листы
- Как это делает прокси: сниффинг SNI, FakeIP, правила по домену и GeoIP в sing-box и Xray
- MikroTik: адрес-листы через DNS (
match-subdomain=yes address-list=), mangle, отдельные таблицы маршрутизации, конфликт FastTrack с маркировкой - Контейнеры в RouterOS v7: device-mode, sing-box и Xray на RB5009
- OpenWrt и Podkop: точечная маршрутизация доменов на VLESS и WireGuard
- XKeen на Keenetic: что умеет и почему хрупкий
Security и low-level¶
- https://timcore.ru/2021/02/24/1-kali-linux-dlja-nachinajushhih-urok-1-osnovy-setej/
- https://makelinux.github.io/kernel/map/
- https://kernelnewbies.org/KernelHacking
- https://bootlin.com/doc/training/linux-kernel/linux-kernel-slides.pdf
- https://wiki.osdev.org/Expanded_Main_Page
- https://www.kernel.org/doc/html/v4.16/process/howto.html
- https://uneex.ru/
- https://habr.com/ru/companies/sberbank/articles/353746/
Ссылки к разбору¶
- https://github.com/mjhea0/awesome-fastapi
- https://github.com/wiseaidev/awesome-fastapi
- https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/nginx.html
- https://dev.to/envoy_/awesome-clones-32l8
- https://github.com/humiaozuzu/awesome-flask
- https://github.com/aimclub/open-source-ops?tab=readme-ov-file
Источники¶
Канон каждого стиля лучше читать в первоисточнике — пересказы почти всегда теряют исходный акцент. Порядок грубо по слоям: сначала организация и домен, потом стили деплоя, миграция, интеграция, данные.
Организация и домен
- Melvin Conway — «How Do Committees Invent?» (Datamation, 1968): откуда растёт Conway's Law. Эмпирическое наблюдение, не предписание: структура системы повторяет структуру коммуникаций команд. Имя «закон» навесил позже Fred Brooks в «The Mythical Man-Month» (1975). Inverse Conway Maneuver — поздняя надстройка, сам Conway его не предлагал.
- Eric Evans — «Domain-Driven Design» (2003): bounded context как граница модели и ubiquitous language. Не маппится один-к-одному ни на microservice, ни на команду, ни на subdomain — это граница смысла, не deployment unit.
Стили деплоя
- Martin Fowler — «MonolithFirst» (2015, martinfowler.com): начинай с monolith, режь на сервисы, когда границы понятны. Дефолт с исключениями, не закон. Здесь же канонично оформлена рамка monolith vs microservices — слово monolith это retronym из эпохи микросервисов, а не «грязный код».
- James Lewis & Martin Fowler — «Microservices: a definition of this new architectural term» (2014, martinfowler.com): каноническое определение стиля. Акцент на independent deployability, decentralized data и organization around business capabilities — не на размере. Термин устаканили на воркшопе архитекторов под Венецией: май 2011, добили май 2012.
- Mary Shaw & David Garlan — «Software Architecture: Perspectives on an Emerging Discipline» (1996): ранний каталог стилей, где разведены logical layers и physical tiers. Layered живёт внутри одного process, three-tier — это отдельные deployable tiers. Не синонимы.
- Yefim Natis & Roy Schulte (Gartner) — «Service Oriented Architecture» (1996): первоисточник термина SOA. Это философия дизайна, не стек: SOAP/WSDL/WS-* и тяжёлый ESB — одна (часто критикуемая) реализация, не определение.
- Simon Brown — доклад «Modular Monoliths» (Devoxx 2016) + simonbrown.je: modular monolith как один deployable с принудительными границами модулей внутри. Не «monolith с папками» и не обязательно ступенька к микросервисам — может быть валидным конечным состоянием. Та же идея — «The Missing Chapter» в «Clean Architecture» Роберта Мартина (2017).
- Stefan Tilkov / INNOQ — Self-Contained Systems, scs-architecture.org (~2015): SCS как автономный вертикальный срез с собственным UI, логикой и данными. Намеренно крупнее микросервисов (мало на систему), интеграция через UI/links и async, а не синхронный RPC.
- Mike Roberts & John Chapin — «Serverless Architectures» (2016/2018, martinfowler.com): разбор serverless/FaaS как стиля. Серверы никуда не делись — их прячет и автоскейлит провайдер. Отправная точка по индустрии — запуск AWS Lambda, ноябрь 2014.
- Carl Hewitt, Peter Bishop, Richard Steiger — «A Universal Modular ACTOR Formalism for Artificial Intelligence» (IJCAI, 1973): первоисточник actor model. Никаких гарантий порядка, доставки или распределённых транзакций из коробки — это потом дописали фреймворки, и location transparency сетевые сбои не отменяет.
- Frank Buschmann et al. — «Pattern-Oriented Software Architecture, Vol. 1» (1996), паттерн «Pipes and Filters»: поток данных через цепочку независимых stateless-фильтров. Концептуальные корни — Unix pipes (Douglas McIlroy, Bell Labs, реализация 1973). Современные распределённые стримы переиспользуют идею, но добавляют parallelism, backpressure, fault tolerance.
Миграция и анти-паттерны
- Martin Fowler — «StranglerApplication», позже «Strangler Fig Application» (2004, martinfowler.com): постепенная замена legacy по краям, обе системы крутятся параллельно. Не big-bang переписывание. Имя дрейфовало от Strangler Application к Strangler Fig.
- Ben Christensen — доклад «Don't Build a Distributed Monolith» (Microservices Practitioner Summit, январь 2016): популяризация термина distributed monolith. Раньше уже встречался у Derek Gottlieb («Distributed Monoliths», блог, июнь 2015), так что Christensen популяризировал, а не придумал. Беда не в числе сервисов, а в coupling: дробление без independent deployability и decoupled data даёт худшее с обеих сторон.
- Sam Newman — «Building Microservices» и «Monolith to Microservices» (O'Reilly, 2019): практика декомпозиции, BFF, и дальнейшая раскрутка термина distributed monolith.
Интеграция, gateway, frontend
- Gregor Hohpe & Bobby Woolf — «Enterprise Integration Patterns» (2003): каталог messaging-паттернов (channels, routers, translators, endpoints). Vendor-neutral словарь, не привязан к конкретному ESB и не только про legacy SOA — ложится и на современные event/stream системы.
- Phil Calçado — «The Back-end for Front-end Pattern (BFF)» (2015, philcalcado.com): практика SoundCloud (идею Calçado приписывает коллеге Lukasz Plotnicki). Один BFF на каждый distinct UX (iOS, Android, web), тонкий слой агрегации и трансляции — не общий god-gateway и не место для domain logic.
- Chris Richardson — microservices.io и «Microservices Patterns»: каталог паттернов, включая API Gateway (~2014, корни в reverse-proxy и SOA gateway). Не путать gateway с load balancer или service mesh, и не раздувать его в «God gateway» с бизнес-логикой.
Данные, события, согласованность
- Roy Schulte и аналитики Gartner — Event-Driven Architecture (~2003): компоненты общаются, порождая и реагируя на события, а не через прямой request/response. Единого seminal paper нет, идея кодифицирована в т.ч. в Hohpe & Woolf. EDA это не «просто message queue»; thin event notification, event-carried state transfer и event sourcing часто путают.
- Greg Young — CQRS (~2010): разделение моделей для команд и запросов. Опирается на Command-Query Separation Бертрана Мейера («Object-Oriented Software Construction», 1988). Разделение на уровне модели, может быть in-process — не обязательно две базы плюс event sourcing. Ключевая популяризация — bliki-статья Фаулера «CQRS» (2011).
- Martin Fowler & Greg Young — Event Sourcing (Fowler bliki, 2005; практика Young ~2006–2010): источник истины это лог событий, текущее состояние выводится реплеем. С CQRS независимы, хоть и часто ходят вместе. Лог это не мутабельная audit-таблица — versioning событий и цена реплея всплывают позже.
- Hector Garcia-Molina & Kenneth Salem — «Sagas» (SIGMOD '87): первоисточник. Long-lived transaction как цепочка локальных с компенсациями. ACID между сервисами не даёт — только eventual consistency через компенсацию, не isolation. Оригинал 1987 года был про long-lived DB-транзакции; распределённая orchestration/choreography — поздняя переинтерпретация.
Если этот раздел расходится с тем, что в основном тексте (микросервисы, Communication & API Style) — верь тексту и правь этот список, а не наоборот.
Главное правило: на оси «один deployable ↔ много» тебя двигают масштаб и оргструктура (закон Конвея), не мода. Дефолт — modular monolith. Каждый сетевой разрез покупаешь ценой latency, частичных отказов и eventual consistency — режь по bounded context и ровно там, где боль уже реальная.