惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
云风的 BLOG
云风的 BLOG
U
Unit 42
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
Vercel News
Vercel News
S
Security @ Cisco Blogs
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
I
Intezer
MongoDB | Blog
MongoDB | Blog
AI
AI
MyScale Blog
MyScale Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
博客园 - 叶小钗
S
SegmentFault 最新的问题
N
News | PayPal Newsroom
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
DataBreaches.Net
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
H
Help Net Security
美团技术团队
博客园 - 司徒正美
T
Threat Research - Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
Kaspersky official blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Vulnerabilities – Threatpost
TaoSecurity Blog
TaoSecurity Blog
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity
J
Java Code Geeks
量子位
Martin Fowler
Martin Fowler
博客园_首页

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Архитектурные решения в backend: 5 практических приёмов, которые помогают держать баланс
sproshchaev · 2026-04-29 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение8 мин

Охват и читатели71

Мнение

Всем привет, меня зовут Сергей Прощаев. Я Tech Lead и руководитель направления Java | Kotlin разработки в FinTech, а ещё преподаю на курсах разработки и архитектуры в OTUS. Сегодня хочу поговорить о том, что на собеседованиях звучит гордо, а на реальных проектах часто превращается в сложности: об архитектурных решениях в backend‑разработке. Точнее — о том, почему наши «идеальные» архитектуры превращаются в Big Ball of Mud, и как этого избежать, не впадая в другую крайность — паралич анализа и бесконечные диаграммы.

Почему «идеальная архитектура» трещит по швам

Знаете это чувство? Проекту полгода, вы начинали на чистом энтузиазме, выбрали модный стек, разбили всё на микросервисы, настроили CI/CD. А теперь каждая фича превращается в квест: нужно обновить три сервиса, согласовать контракты, разобраться с распределёнными транзакциями и понять, почему упал staging. Код стал тем самым «комком грязи», который уже не спасают ни Docker, ни Kubernetes.

Почему так происходит? Основная ловушка — мы пытаемся спроектировать финальную архитектуру в момент максимальной неопределённости. Когда требования меняются каждую неделю, бизнес сам не до конца понимает, куда пойдёт продукт, а мы уже закладываем event sourcing, CQRS и асинхронные очереди. В стартапах и быстрорастущих продуктах это особенно заметно. Бизнесу нужен быстрый MVP, а инженерная гордость подталкивает заложить «масштабируемое решение». В итоге — переусложнённая система, которую невозможно развивать без полного рефакторинга, денег на который никто не даст.

Я не раз попадал в эту ситуацию. В FinTech‑проектах, где важна надёжность, цена ошибки особенно высока. Помню, как один платёжный сервис мы с командой сразу спроектировали микросервисами: отдельно — приём платежей, отдельно — валидация, отдельно — нотификации. Всё по лучшим канонам. Через полгода выяснилось: бизнес‑процесс проведения платежа требует жёсткой консистентности, и мы мучались с распределёнными транзакциями, сагами и компенсациями.

В конце концов пришлось откатиться к модульному монолиту, где вся бизнес‑логика выполнялась в одной ACID‑транзакции, а интеграции были вынесены в адаптеры. А спустя ещё год, когда мы чётко нащупали domain boundaries, отдельные модули естественным образом стали кандидатами на выделение в самостоятельные сервисы. Но это было уже осознанное решение, а не дань моде.

Этот опыт научил меня простой мысли: хорошая архитектура не та, что предсказывает будущее, а та, что позволяет дешево менять решения. Именно об этом сегодня и расскажу.

Эволюционная архитектура: меньше предсказаний — больше адаптивности

На своих занятиях я часто показываю слайд с понятием «эмерджентная архитектура» (emergent architecture), изображенный на рисунке 1.

Рис. 1 Эмерджентная архитектура в действии: надземная инфраструктура не замораживает пространство под собой, оставляя город открытым для изменений

Рис. 1 Эмерджентная архитектура в действии: надземная инфраструктура не замораживает пространство под собой, оставляя город открытым для изменений

Ключевая идея: в условиях высокой неопределённости мы не можем и не должны принимать необратимых решений раньше времени. Каждое архитектурное решение — это опцион, который мы держим открытым настолько долго, насколько это возможно. Решение становится обязательством (commitment) только когда без него уже нельзя двигаться дальше.

Это не значит, что надо писать код бездумно. Это значит — итеративно‑инкрементально уточнять архитектуру вместе с пониманием предметной области. Вместо того чтобы сразу разбивать систему на десять микросервисов, мы стартуем с модульного монолита. Жёстко разделяем код на модули, строго следим за направлением зависимостей, используем принцип разделения ответственности (SoC). А границы модулей чертим по мере накопления знаний о бизнес‑домене.

Мне очень близок подход Domain‑Driven Design в его стратегической части. Мы не пытаемся угадать все ограниченные контексты (Bounded Contexts) заранее, а ищем их «на живую»: наблюдаем, где чаще всего меняются требования, где команды начинают мешать друг другу, где возникает разное понимание одних и тех же терминов. Такие естественные швы и становятся кандидатами на границы будущих сервисов.

Важный момент: эволюционная архитектура без дисциплины превращается в хаос. Нужно осознанно управлять архитектурными решениями. Именно для этого я использую Architectural Decision Records (ADR) — лёгкие документы, в которых фиксирую контекст, рассмотренные альтернативы, принятое решение и его последствия. Отклонённые варианты тоже записываю — через полгода они часто всплывают, и коллеги понимают, почему мы тогда пошли иначе. ADR отлично работают в связке с C4-диаграммами: System Context, Container, Component — они дают картинку текущего состояния, а ADR объясняют, как мы к этому пришли.

Практические приёмы, которые помогают держать баланс

1. Начинайте с модульного монолита.
Это не откат к 2000-м. Современный модульный монолит — это хорошо структурированное приложение, в котором каждый модуль инкапсулирует свою логику, работает со своими моделями (DTO, domain models, persistence models) и коммуницирует с другими модулями через чёткие API, а не через прямые обращения к базе. Я предпочитаю раскладывать модели по DDD‑стилю: транспортные модели для контрактов, модели хранения для БД, внутренние модели предметной области. Связываю их через мапперы, не позволяя смешиваться.

2. Применяйте принцип YAGNI без фанатизма.
You Aren«t Gonna Need It — не нужно закладывать функциональность, которая не подтверждена текущими требованиями. Но при этом стоит предусматривать точки расширения. Например, если вы знаете, что через два месяца добавится второй способ нотификации, заложите интерфейс и стратегию, но не реализуйте вторую стратегию до тех пор, пока она не понадобится. Это классический компромисс между KISS и DRY — код должен оставаться простым, но не дублироваться там, где это аукнется.»

3. Используйте порты и адаптеры (гексагональную архитектуру).
Это великолепный шаблон для модульного монолита, который потом легко эволюционирует в микросервисы. Бизнес‑логика не зависит от транспорта (HTTP, Kafka) и хранилища. Когда приходит время выделить функциональность в отдельный сервис, вы просто меняете вызов метода на HTTP/gRPC, оборачиваете адаптер и не трогаете ядро. На рисунке 2 изображен пример.

Рис. 2 Принцип портов и адаптеров: бизнес-логика изолирована от инфраструктуры

Рис. 2 Принцип портов и адаптеров: бизнес‑логика изолирована от инфраструктуры

Пунктирные линии здесь лишь обозначают, что адаптеры не должны напрямую влиять на ядро; основная связь — через порты.

Ядро приложения (бизнес‑логика) ничего не знает ни о HTTP, ни о базе данных, ни о Kafka. Оно общается с внешним миром через абстракции — порты (интерфейсы). Адаптеры подключаются к этим портам снаружи. Именно это позволяет:

  • легко заменить БД или транспорт, не трогая бизнес‑логику;

  • тестировать ядро изолированно;

  • при необходимости выделить модуль в отдельный микросервис, не переписывая его.

4. Документируйте архитектуру как код.
Я уже упомянул ADR. Добавьте к ним C4-диаграммы в виде PlantUML или Mermaid, которые хранятся в репозитории. Так документация остаётся живой и не устаревает уже через спринт, как многостраничные ТЗ из 2000-х.

5. Встраивайте тестируемость на уровне архитектуры.
Нефункциональные требования — не галочка для отчёта. Если вы с самого начала проектируете модули так, чтобы их можно было тестировать изолированно, имитируя границы, — вы закладываете огромный запас прочности. Это напрямую влияет на надёжность и скорость внесения изменений.

О чём молчат учебники, когда рассказывают про best practices

В учебниках часто показывают готовые схемы: вот вам Event‑Driven, вот CQRS, вот чистая луковичная архитектура. Но реальный мир грязнее. Успешные команды не исповедуют одну религию. Они эволюционируют прагматично.

Взгляните на эволюцию многих известных проектов. Netflix начинали с монолита, и только когда масштаб и отказы стали болезненными, всерьёз вложились в микросервисы — но при этом параллельно выстроили культуру Chaos Engineering и организационно перешли на DevOps‑команды. Или история с Uber: компания прошла путь от монолита к мелким микросервисам, а затем — к более крупным domain‑oriented сервисам, когда стало очевидно, что слишком мелкая нарезка создаёт невыносимую сложность. То есть они сначала приняли одно решение, потом осознали его цену и скорректировали курс. Именно эту свободу и даёт эволюционная архитектура: право передумать без катастрофы.

Популярная платформа Notion в какой‑то момент переписывала свой backend с монолита на микросервисы, но в итоге пришла к гибридной модели: часть логики осталась в монолите, часть вынесена. Потому что бизнес‑требования к скорости коллаборации не вписывались в сетевые задержки микросервисов.

Все эти кейсы объединяет одно: архитектурные решения не были высечены в камне. Они документировались, пересматривались и менялись вместе с ростом понимания.

Схема — как выглядит эволюционный путь

Давайте подведу итог схемой. Она показывает не строгий алгоритм, а скорее направление движения в типичном backend‑проекте (рис. 3).

Рис. 3. Эволюция backend-архитектуры: от монолита к микросервисам через модульный монолит

Рис. 3. Эволюция backend‑архитектуры: от монолита к микросервисам через модульный монолит

Главная идея: микросервисы — это не стартовая точка, а результат зрелости системы и команды. Начинаем с простого, усложняем ровно тогда, когда простота перестаёт справляться с нефункциональными требованиями: производительностью, надёжностью, независимостью развёртывания.

Заключение: архитектор — это стратег, а не предсказатель

Работа архитектора в backend‑разработке — это не создание идеальной диаграммы. Это способность видеть систему в динамике: предвидеть точки напряжения, откладывать необратимые решения и формировать среду, в которой команда может быстро адаптироваться.

Хорошая архитектура экономит миллионы рублей и месяцы разработки. Плохая — блокирует бизнес и убивает мотивацию команды. Модульный монолит, DDD, ADR, гексагональная архитектура — это не магические заклинания, а прагматичные инструменты в руках того, кто умеет думать категориями изменений.

Если вам близок такой взгляд и хочется разобраться глубже — приглашаю на свои бесплатные открытые уроки курса «Архитектор программного обеспечения» в OTUS. Там мы на практике посмотрим, как принимать архитектурные решения в условиях неопределённости, проектировать модульные системы и выбирать стиль, который не превратится в комок грязи через полгода.

  • 5 мая в 20:00 — «Архитектурные решения в backend-разработке». Записаться

  • 21 мая в 20:00 — «API Gateway и не только: шаги к идеальной архитектуре внешних API». Записаться

Перед глубоким погружением в архитектуру полезно честно сверить текущий уровень. Пройдите бесплатное вступительное тестирование. ➡[Пройти тестирование]