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

推荐订阅源

N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
NISL@THU
NISL@THU
WordPress大学
WordPress大学
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
L
LINUX DO - 热门话题
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX
G
GRAHAM CLULEY
TaoSecurity Blog
TaoSecurity Blog
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Latest news
Latest news
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
S
Schneier on Security
I
Intezer
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
爱范儿
爱范儿
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
美团技术团队
B
Blog RSS Feed

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
Секрет устойчивых платформ для умного города: SOLID, GRASP и Clean Architecture в деле
Фалькон Тех · 2026-06-24 · via Все публикации подряд на Хабре

Средний

8 мин

72

Запускаем большой проект? Значит, берём SOLID. Мы не раз слышали это от CPO и менеджеров продукта. О нём, кажется, знают все — и все хотят применить. Но он не спасёт масштабные проекты. Например, устойчивый умный город с решениями на основе машинного зрения на одном SOLID не построить. По канонам SOLID можно писать аккуратный код, но это не создаст архитектуру всей системы. Что на самом деле работает — подобранный под бизнес-цели набор инструментов, направленный на защиту ядра приложения.

В статье — кейс Сергея Францишкова, начальника отдела разработки «Фалькон Тех», о рабочих решениях для крупной архитектуры и внедрении GRASP + Clean Architecture.

Мы — команда инженеров «Фалькон Тех», и уже 8 лет мы разрабатываем ПО с использованием ИИ и машинного зрения. За это время создали систему из более чем 3 000 программно-аппаратных комплексов в Москве. В прошлой статье рассказали, на каком стеке и железе работает видеоаналитика в мегаполисах.

Сегодня поделимся кейсом перехода с «голого» SOLID на рабочую систему SOLID + GRASP + Clean Architecture. Благодаря такому принципу проектирования бизнес-логика, работа видеоаналитики и в целом наша система комплексов не рухнут, даже если завтра город решится на кардинальные инфраструктурные изменения.

Из статьи вы узнаете:

  • зачем нужна архитектура и что работает помимо SOLID;

  • как GRASP и Clean Architecture помогают на крупных проектах;

  • как организовать кодовую базу так, чтобы она выдерживала смену технологий.

Зачем вообще архитектура

Цифровые системы должны помогать бизнесу повышать операционную эффективность, сокращать издержки и снижать риски. Для этого они должны состоять из связанных компонентов, которые вместе приносят результат. Некоторые реализуют God Object и всё связывают со всем. Этого нужно избегать — иначе одно исправление кода рискует навредить системе. А если она масштабна — например, охватывает целый город, — очень важно сделать её устойчивой к изменениям. При этом необходимо не допустить и другой крайности, чтобы она не развалилась на независимые кусочки. Следовательно, для системы нужна единая архитектура.

Есть две цели создания архитектуры:

  • повысить внутреннее качество кода; повысить прозрачность и ясность бизнес доменов. Все это упростит сопровождение и расширение системы.

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

Архитектура помогает удерживать систему «в форме». Ниже рассказываем, что для этого делать. Но сначала дисклеймер: упомянутые в статье инструменты направлены на защиту ядра — главенствующей функциональности.

Почему одного SOLID мало

SOLID — это пять принципов ООП:

  • S (Single Responsibility) — у сущности или её поведения запросы на изменения должны исходить от одного источника ответственности

  • O (Open-Closed) — система должна быть открыта для расширения и закрыта для изменения.

  • L (Liskov Substitution, принцип Барбары Лисков) — наследуемые сущности должны использоваться наравне с родительскими, без нарушения родительского контракта. Если есть объект A и объект B (наследник объекта A), в случае замены A на B в коде, система продолжит работать корректно с предсказуемым поведением, вне зависимости от знания, что используются сущности от наследников.

  • I (Interface Segregation) — большие интерфейсы хуже маленьких. Классу проще реализовать несколько, более специфичных ему, интерфейсов, чем тянуть за собой один громоздкий интерфейс с кучей ненужных методов.

  • D (Dependency Inversion) — зависимости должны быть направлены к ядру системы и не должны тянуть за собой детали реализации. Детали реализации должны исходить от клиентского взаимодействие, если ему требуется работать с инфраструктурными элементами (HTTP-подключение, клиент, CLI-взаимодействия), то реализация взаимодействия определяется на внешнем уровне. Это делает зависимости и интерфейсы гибче и устойчивее.

SOLID — не гарантия чистой системы

Принципы SOLID — это рекомендации по созданию поддерживаемых сущностей низкого уровня, например классов, объектов, модулей. В то время как Clean Architecture — это архитектурный шаблон более высокого уровня, который организует все приложение по слоям для обеспечения разделения задач, логики, абстракций. Но в реальных больших продуктах остаются структурные «дыры»:

  • Сильная связанность — SOLID не регламентирует, как модули и слои системы будут общаться. Иногда возникает скрытая тесная связь между подсистемами.

  • Дублирование логики — принципы S и I улучшают объект, но не решают проблему дублирования бизнес-правил. Становится сложно вносить изменения за счёт связанности отображения с поведением.

  • Инфраструктура ломает ядро — даже при соблюдении D инфраструктурные особенности «протекают» в домен через адаптеры и DTO. Ядро оказывается чувствительным к изменениям.

GRASP как следующий уровень

SOLID — набор концепций о том, как должен быть устроен класс, структура, модуль, а GRASP (General Responsibility Assignment Software Patterns) — набор паттернов, который описывает взаимодействие между классами и структурами.

Основные паттерны GRASP:

  • Information Expert — Если объект обладает всей или большей частью информации, необходимой для выполнения операции, то именно он ее и должен производить.

    Если нужно сделать расчёт финальной стоимости заказа, имеет смысл поместить этот расчёт в объект заказа, а не выносить это в отдельную структуру, которой придется запрашивать данные.

  • Controller — отвечает за обработку внешних событий и координацию поведения.

    Компонент, на границе домена/системы, который связывает основную логику с внешним миром. К примеру это может быть отдельный веб-сервис с http/grpc эндпоинтами, CLI-утилита, rabbit/nats consumer и пр.

  • Creator — объект создает другой объект, если он им владеет или его использует.

    Креатор — это не фабричный метод. Это правило, что мы должны давать возможность классу или структуре порождать другие объекты. А вот уже способом реализации будет фабричный метод или порождающий паттерн.

  • Низкая связанность (low coupling) — компоненты минимально зависят друг от друга.

    Когда компонент использует логику или данные другого компонента, это создает связность между ними. Ее нужно стараться уменьшить. Понятно, что компоненты находятся не в вакууме и избежать взаимодействия вряд ли получится. Но важно, чтобы один компонент не начинал пользоваться внутренними деталями другого как своими.

  • Высокая связанность (high cohesion) — внутри компонента всё максимально логически связано, а лишние методы/поля выносятся наружу или выделяются в другой компонент, действуя по такому же принципу логического объединения и сфокусированности.

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

Если резюмировать, GRASP — системное мышление в проектировании: он защищает от ситуации, когда бизнес-логика «размазана» по интерфейсам и вспомогательным компонентам. Мы ищем и обучаем специалистов, которые умеют с ним работать, чтобы делать качественные продукты. Читайте подробнее на Хабр Карьере.

Чистая архитектура (Clean Architecture) в реальном проекте

Максимально кратко, SOLID говорит, как проектировать компоненты, GRASP объясняет, как распределять обязанности между ними, а Clean Architecture — делает систему независимой от инфраструктуры.

«Термин Clean Architecture ввёл Роберт Мартин. Он считал, что бизнес-логика должна быть независимой от деталей реализации, а инфраструктуре необходимо подключаться как «плагины». Не ядро зависит от базы данных, а наоборот — технологии подключаются к приложению как сменные модули.»

– Цитата эксперта

Изображение: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

Изображение: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

Четыре слоя Clean Architecture

Классическая схема чистой архитектуры включает четыре слоя. На практике не часто проводят грань между слоем фреймворка и инфраструктуры. Делают это для упрощения и ввиду того, что они часто разрабатываются вместе. Поэтому дальше они будут фигурировать как один слой.

Получается так:

  • Домен — бизнес-сущности и правила;

  • Приложение — что система должна делать;

  • Инфраструктура и фреймворки — базы данных, REST/gRPC, API.

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

Как наложить Clean Architecture на реальный код
(на примере сервиса Offense Collector в умном городе)

Как Clean Architecture выглядит в репозитории и почему это удобно? Возьмём реальный кейс из систем умного города. Сервис Offense Collector собирает доказательную базу для возможности оформления нарушений из разных источников.

Создание архитектуры

Мы использовали «кричащую» архитектуру — когда имена модулей говорят, что за что отвечает. Это разгружает мозг разработчика.

Структура проекта по папкам

Структура проекта по папкам

Папка с infrastructure содержит модули setup, worker и реализации клиентов. В папке application лежат репозиторий и модуль use_cases с пользовательскими сценариями. И последний слой domain, который содержит бизнес-сущность правонарушения и её логику.

Структура проекта по папкам

Структура проекта по папкам

Структура проекта по папкам

Структура проекта по папкам

Структура проекта по папкам

Структура проекта по папкам

Папка с репозиториями — это набор интерфейсов по паттерну репозиторий, определяющий обмен данными, как пример с СУБД. На слое приложения их реализации нет — она лежит на уровне инфраструктуры.

Дальше идёт реализация конкретного сценария системы (use cases).

Внедрение use cases

Один из ключевых элементов слоя приложения — это структура use cases. Рассмотрим конкретный случай — обработку, фиксацию и отправку сформированного сообщения с необходимыми данными для доказательной базы (далее - парсель). Если посмотреть на код, то внутри метода происходит следующее:

Пример проекта use case

Пример проекта use case

  1. Берём данные из репозиториев;

  2. Преобразуем их в доменные сущности;

  3. Передаём дальше.

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

На уровне приложения зависимости есть только от своего слоя и доменного слоя.
Домен — автономен, никак не завязан на инфраструктуру, библиотеки и фреймворки.

Создание точка входа

main — место, где собираются плагины. Главный компонент производит инициализацию клиентов Rabbit/HTTP, баз, инстансов репозиториев — всего, что нужно юзкейсу, и сам юзкейс. Дальше происходит запуск.

Пример входной точки main

Пример входной точки main

«Такая чистая архитектура очень выгодна, если в будущем придётся поменять технологии. Например, сегодня use case получает события через RabbitMQ. Завтра нужно перейти на HTTP-сервер. Мы изменим только адаптер, который передаёт событие в сценарий. Весь остальной код трогать не будем.»

— Андрей Борисов, Старший back-end разработчик в «Фалькон Тех»

Что это дает бизнесу

Обобщим плюсы подхода:

  • Понятная структура проекта (кричащая архитектура);

  • Устойчивость бизнес-логики и ядро, не завязанное на фреймворках;

  • Возможность тестирования без инфраструктуры, простота для QA;

  • Защита от «грязного кома»: разделение слоёв, зоны ответственности, контролируемые зависимости.

И, конечно, чистый код, в котором каждый слой независим и изменения в одном слое не ломают другие.

Замена технологий (например, RabbitMQ → HTTP) проводится без исправления бизнес-логики. Мы получаем эволюцию проекта вместо переписывания его частей. Минусы тоже есть: высокий порог входа, множество файлов и невысокая скорость разработки — сочетание фреймворков не подходит для коротких проектов. Но если речь о крупных системах с использованием новых технологий, когда нужны ИИ и машинное зрение, этот подход работает.

Плюсы

Минусы

Чёткая структура приложения.
Даже новичку понятно, где что искать.

Порог входа выше. Нужно разбираться
в слоях, зависимостях, интерфейсах.

Слабая связанность компонентов.
Можно менять инфраструктуру,
не затрагивая бизнес-логику.

Сложно применять на маленьких проектах или MVP, где ценится скорость.

Упрощённое тестирование.
Нет необходимости в тяжёлых моках
или окружениях.

Много файлов, интерфейсов, структур — можно запутаться при плохом нейминге.

Возможность делегирования.
Каждый слой может разрабатываться независимо.

В одиночку SOLID не спасет

Резюмируем: SOLID нужен, но сам по себе большие проекты он не спасает. Однако, если добавить к нему GRASP + Clean Architecture, это комбо даст устойчивость и гибкость.

Практические рекомендации:

  • Не отказываться от SOLID, потому что он помогает делать аккуратные компоненты.

  • Понять, как реализовано взаимодействие между компонентами и интерфейсами.

  • Применить GRASP — определить, что за что отвечает.

  • Использовать Clean Architecture и делать систему независимой.

Важно понимать, что архитектура — это не финишный пункт, а дорожная карта. Со временем требования меняются, и появляются новые сценарии. И поддерживаемая чистая архитектура позволяет постепенно развивать систему без головной боли.

Желаем удачи на ваших проектах,
Команда инженеров «Фалькон Тех»

Нравятся строгие правила кодинга, системность и чистая архитектура?
Заходи на Хабр Карьеру — там делимся нашими условиями, требованиями к кандидатам, вакансиями с указанной зарплатой.