Обновить
7.53

Проектирование и рефакторинг *

Реорганизация кода

Сначала показывать
Порог рейтинга
Уровень сложности

Снижаем когнитивную сложность при проектировании архитектуры приложения

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров455

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

Когнитивная сложность при проектировании приложения часто возникает из‑за смешения архитектуры кода и архитектуры приложения. В большинстве случаев эти термина никак не разделены, а также эти термины не имеют однозначного толкования, как по содержанию так и по контексту использования. В практике и литературе эти понятия часто используются как синонимы или в пересекающихся контекстах, что приводит к неоднозначности. В зависимости от контекста (например, обсуждение микросервисов, монолитов, паттернов проектирования или рефакторинга), один и тот же термин может обозначать как уровень организации кода, так и более высокий уровень организации приложения или системы. В профессиональной литературе и стандартах (например, TOGAF, ArchiMate) архитектура программного обеспечения охватывает оба аспекта и организацию кода, и организацию приложения, что еще больше стирает границы между этими понятиями.

Пора этой порочной практике сказать решительное НЕТ!

Сказать решительное НЕТ

Новости

Что такое API Gateway: 10 главных функций и роль в архитектуре микросервисов [полный гайд]

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.2K

Микросервисная архитектура уже давно стала нормой для IT-продуктов. И одну из центральных ролей в таком подходе занимает API Gateway.

В этой статье разберём, что такое API Gateway, зачем он нужен в микросервисной архитектуре, какие 10 ключевых функций он выполняет, и является ли он потенциальной точкой отказа в системе.

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

Материал будет полезен системным аналитикам, начинающим архитекторам, разработчикам и тестировщикам, особенно при подготовке к собеседованиям в продуктовые компании.

Оглавление:
Что такое API Gateway
10 главных функций API Gateway
Виды API Gateway
API Gateway - центральная точка отказа
Примеры схем архитектуры с API Gateway в нотации C4 (и не только)
Заключение и полезные ссылки

Читать далее

Workflow like it’s hot или почему Temporal.io это база для бизнес логики

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров591

Из первых уст рассказываю как переход на Temporal обеспечил надежную доставку клиентских услуг в контексте обычного хостинга.

Читать далее

Используем агентов LLM для миграции кода

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров614

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

Читать разбор

Может ли искусственный интеллект заменить человека?

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.4K

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

Я уже 26 лет работаю в сфере ИТ и за это время написал немало кода. Месяц назад решил проверить, насколько действительно эффективен искусственный интеллект, и попробовать создать с его помощью сайт. И я его создал — точнее, создал его не я, а он. Вот результат: https://windowrepino.ru/. Я лишь ревьюил код и делал рефакторинг.

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

Тут немного подробнее: месяц назад у меня не было даже идеи, как должен выглядеть мой сайт и что я хочу. И за этот месяц я потратил кучу времени на то, чтобы сделать фотографии, изучить архивы и объездить весь посёлок в поисках интересных мест.

Плюс сама работа с фото — выбрать хорошие кадры, обрезать лишнее, что-то поправить, где-то почистить. Всё это вместе с кодом было сделано за месяц.

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

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

Читать далее

Управляем техдолгом, пока он не начал управлять нами

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров3K

Все разработчики знают, что такое техдолг.

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

Предлагаю разобраться, что же это такое, откуда берется и что с этим всем можно делать.

Читать далее

Инженерная зрелость. Исследование практик и триггеров

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров1.8K

Почему одни команды релизят предсказуемо и без героизма, а другие тушат пожары на продакшене каждую неделю?

Мы решили выяснить, какие инженерные практики превращают разработку в систему с понятными процессами и предсказуемыми результатами.

Исследование 100+ респондентов.

Читать далее

Компактный runtime-DI для Java: JSR-330, Class-File API и миграция за 2 дня

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров1.1K

Когда начинал разработку системы многомерного анализа данных временных рядов Dimension-UI, для внедрения зависимостей в исходном коде решил использовать Dagger 2. Практический опыт показал, что для приложений с большим количеством динамически создаваемых объектов инверсия зависимостей, реализованная в Dagger 2, не подходит.

Да, создание графа зависимостей в compile-time — это, во-первых, очень быстро, и, во-вторых, удобно: получаешь сообщения об ошибках конфигурации уже при компиляции.

Но накладные расходы на сопровождение всего этого хозяйства – прямо скажем, это боль.

Чтобы реализовать scope-зависимости, приходится писать и поддерживать много инфраструктурного кода внутри объектов, куда мы внедряем зависимости. В Dagger 2 такая реализация, во-первых, «загрязняет» код, а во-вторых, серьезно осложняет тестирование. Изолировать методы удобным способом не получается: в тестах нужно писать очень много кода, чтобы прокинуть необходимый контекст и корректно мокировать внешние зависимости. Я туда просто не полез — покрывал unit- и UI-тестами только базовую функциональность, где были Singleton-зависимости.

Даже с одними Singleton’ами приходится поднимать отдельную тестовую инфраструктуру для запуска приложения в тестовом режиме. Это не просто неудобно — это очень затратно по времени. Если сравнить усилия, которые надо потратить на реализацию тестирования подобного функционала в Spring и Dagger… Сравнение будет не в пользу Dagger. В целом я начал думать о переходе на runtime-генерацию графа зависимостей.

Читать далее

Mobile System Design

Уровень сложностиСложный
Время на прочтение17 мин
Количество просмотров3.2K

Mobile System Design — один из ключевых навыков мобильного инженера.

Именно он часто определяет уровень зрелости: в реальной работе, на собеседованиях и в матрицах компетенций компаний.

Но вокруг этой темы полно разночтений и разных трактовок — отсюда споры, путаница и хаос.

В этой статье я систематизирую Mobile System Design как дисциплину: покажу, какие навыки действительно важны и как они проверяются. Это не личное мнение, а выжимка из опыта инженеров, требований собеседований, литературы и практики команд.

Читать далее

Не обижайте Django

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров7.7K

Чем популярнее становится FastAPI, тем сильнее критикуют Django. И не просто критикуют. Брезгуют? Пренебрегают? Всего понемножку. Всё чаще слышу, что Django — пережиток прошлого. Любой проект на Django — устаревший мусор. Любой «джанговод» — просто не знает, что тоже устарел. Объективно ли это? Нет, не объективно. Если отвёртка плохо забивает гвозди, это не значит, что отвёртки устарели — просто это не их задача.

Читать далее

Агент на Kotlin без фреймворков

Уровень сложностиСредний
Время на прочтение28 мин
Количество просмотров2.3K

Статья является продолжением Пишем агента на Kotlin: KOSMOS, но может читаться независимо. Мотивация к написанию — сохранить читателю время на возьню с фреймворками для решения относительно простой задачи.

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

В статье хочу показать, как самостоятельно написать аналог Koog или Langchain4j. У вас не будет всех их фичей, зато будет очень простая и расширяемая система.

Читать далее

Дэвид Л. Парнас «О критериях для разбиения систем на модули»

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров3.9K

Статья Парнаса «О критериях...» давно стала классикой, на которую постоянно ссылаются, но мало кто ее реально читает. Высказанные в ней идеи о «сокрытии информации» как основе модульности упоминаются повсеместно, однако оригинальный текст с его тщательной аргументацией и яркими примерами остается для многих терра инкогнита. Данный перевод призван восполнить этот пробел.

Читать далее

Полный гайд по автотестам для лидов и разработчиков. Часть 3. Про царь-тесты

Уровень сложностиСложный
Время на прочтение9 мин
Количество просмотров3.9K

В первой части мы озвучили следующие тезисы:

- автотесты нужны не для экономии на тестировщиков, а чтобы сократить до минимума циклы разработки и узнавать об ошибках практически мгновенно;

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

- тесты ломают разработчики, поэтому им за них отвечать - все виды тестов должны писать и поддерживать разработчики;

- с полным автоматическим регрессом можно и нужно ставиться в прод после каждого изменения в кодовой базе;

- главный шаблон поставки в прод изменений - конвейер развертывания (Deployment Pipeline);

- конвейер делится на 2 главные фазы: commit stage и acceptance stage;

- первая фаза - быстрые тесты (до 5 минут), чтобы быстро узнать, что ветка сломана и её надо скорее чинить;

- вторая фаза - приёмочные тесты (до 1 часа), чтобы узнать, можно ли ставить в прод изменения.

Про быстрые тесты мы поговорили во второй части. Пришло время поговорить про короля автотестов - приёмочное тестирование.

Читать далее

Ближайшие события

Разбираемся с DDD: как проектировать доменный агрегат, чтобы он не стал безразмерным

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров7.3K

Последние 4 года я занимаюсь реализациейпроектов на PHP по DDD, используя слоистую архитектуру. Каждый раз я сталкиваюсь с одной из самых насущных проблем DDD: определение границ агрегата. Ведя разработку «как удобно», очень легко не заметить, как вся бизнес логика сосредоточилась в один «божий класс».

В этой статье я поделюсь своим опытом, как проектировать и разрабатывать по DDD, не скатываясь в «один агрегат, чтобы править всеми». Поговорю о проблемах определения границ агрегата и цены чтения, гидрации и содержания больших объектов в памяти PHP процесса.

Читать далее

Как аналитику разобраться в legacy-системе без документации

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров1.2K

Приветствую всех! С вами старший системный аналитик, эксперт онлайн-школы по системному анализу Ольги Пономарёвой System Analyst. Статья основана на практическом опыте, в нашей школе мы не просто даем теорию, а любим делиться тем, что действительно работает на проектах.

Разбор legacy-системы без документации кажется сложной задачей. Но это возможно с правильным подходом и современными инструментами. Это руководство даст вам план действий, практические методы и покажет, как использовать ИИ для ускорения работы.

Читать далее

Стоит ли игра свеч? Менее кратко о Single SPA (часть 2)

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров2.9K

Около года назад я написал первую часть статьи о Single SPA — о том, как я выбирал архитектурный подход, боролся с монолитом и пробовал собрать первые микрофронтенды. В статье были разобраны базовые принципы работы Single SPA, подключение importmap, сравнение с другими архитектурными решениями и настройка сборки на Webpack и Vite.

Эта статья — продолжение цикла. Здесь я поделюсь практикой: как на самом деле живётся с Single SPA, какие есть подводные камни и что можно вынести в виде рекомендаций.

Сразу скажу: Single SPA — не «серебряная пуля» и уж точно не современный тренд фронтенд-разработки. В 2025-м появилось еще больше других подходов, которые решают похожие задачи иначе. Но Single SPA всё ещё актуален там, где есть огромные легаси-системы, которые невозможно переписать с нуля. И вот именно для таких кейсов мой опыт может быть полезен.

Читать!

Гайд по автотестам, часть 2. Юнит-тесты

Уровень сложностиСложный
Время на прочтение10 мин
Количество просмотров4K

В первой части мы разобрали верхнеуровневую теорию автотестирования: сколько каких тестов нужно, кто должен их писать, и для чего это все. В этой части мы уже подойдем к практическим вопросам: разберёмся в том, что в первой части я назвал быстрыми тестами, то есть с тем, что обычно понимают под "юнит-тестами".

Из всех видов автотестирования этот самый популярный. Но даже несмотря на это, половина разработчиков юнит-тесты не пишет и не умеет писать вовсе, а вторая половина пишет так, что лучше б и не писала. Либо чисто ради покрытия, либо просто от балды, как сердце подскажет.

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

Отсюда сформулируем главные вопросы, на которые мы ответим в этой статье:

- Нужно ли вам писать юнит тесты под ваши задачи? Или лучше выбрать другой тип тестирования и ограничиться только им?

- Если все же да, то как тогда писать юнит-тесты? Какие есть подходы, и какой лучше выбрать?

Короче, всё как обычно: как и нафига?

Читать далее

Реализация сервиса на C++: TDD, DDD и событийно-ориентированная архитектура

Уровень сложностиСредний
Время на прочтение33 мин
Количество просмотров7K

Статья о реализации сервиса на C++ с применением TDD, DDD и событийно-ориентированной архитектуры. Проект переносит идеи из книги «Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура» на C++.

Читать далее

Паттерн «Душитель». Как развивать сложные системы, не ломая старое

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров5.7K

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

Читать далее

Динамическое планирование задач в NiFi

Время на прочтение9 мин
Количество просмотров453

Статья о том, какие бывают ограничения самописных планировщиков задач и как мы перевели весь процесс планирования в NiFi, сделав его более прозрачным.

Читать далее
1
23 ...