Обновить
64K+

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

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

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

Навигация во Flutter: выносим переходы из экранов

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

Гайдлайны Apple, Android и Flutter по-разному, но одинаково настойчиво подталкивают задавать переход прямо в коде экрана — в документации go_router это штатный пример. В результате экран отвечает и за интерфейс, и за навигацию: его трудно переиспользовать, он знает про следующие экраны, а модульный тест превращается в интеграционный.

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

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

Читать далее

Новости

«Да, конечно»: как один вопрос на брифинге переписал ролевую модель

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

Как три вопроса к заказчику про жизнь после MVP поменяли ролевую модель портала: от одной таблицы связей к RBAC + ABAC. Внутри ER-диаграмма, SQL проверки доступа и пример на живом пользователе.

Плюс список вопросов, которые теперь задаём на каждом брифинге про доступы.

Читать далее

XML-маршруты в redb.Route: схема в редакторе, проверка на сборке и замена модуля на лету

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели6.3K

Маршрут в .route.xml на том же движке, что и C#: подсказки в VS Code, проверка пакета в dotnet build, граф-редактор и горячая замена модуля.

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

В 4.0 у redb.Route появилась вторая запись маршрута: XML. Файл .route.xml кладётся в пакет, пакет в папку работающего сервиса, и меньше чем через полсекунды по новому маршруту идёт первое сообщение. При этом ...

Читать далее

Бэкенд без лишних граблей: 13 статей о PostgreSQL, микросервисах и коде

Время на прочтение4 мин
Охват и читатели7.1K

Что общего у раздувшегося индекса, неудачно нарезанных микросервисов и лишнего std::move? Все они выглядят безобидно, пока не доходят до продакшена. В этом дайджесте собрали 13 разборов бэкенд-задач, в которых детали решают всё.

Смотреть подборку статей

Как я собрал бота‑команду из 11 ИИ‑юристов и что под капотом пошло не так первым же смоук‑тестом

Время на прочтение10 мин
Охват и читатели6.7K

Полтора месяца назад мне пришла претензия на 44 тысячи рублей за фото восьмилетней давности на сайте нашего отеля — типичный «фотобанковский» иск с QR-кодом, печатью и таблицей коэффициентов. Разбирался сам, с помощью Claude, закрыл спор на 20 тысячах вместо 44 без суда и без найма юриста. Написал об этом на VC.ru — сюда, на Хабр, тащить ту же историю смысла нет, тут расскажу, как это в итоге превратилось в бота и что было интересного технически: архитектура, пять реальных багов с продакшена и то, как я срезал расходы на Claude API почти на порядок.

Получился Telegram-бот и мини-апп (бесплатный, пока без монетизации), за которым стоит не один универсальный ассистент, а 11 персонажей-юристов с разной специализацией: авторские права, трудовые споры, ЖКХ, недвижимость, бизнес и так далее. Ниже — не питч, а разбор архитектуры и конкретных багов, которые всплыли по пути, с кодом и цифрами.

Читать далее

Нотация C4: полный гайд по моделированию архитектуры с примерами, разбором ошибок и промптом для ИИ

Уровень сложностиСредний
Время на прочтение27 мин
Охват и читатели7.8K

Для описания архитектуры важно выбрать подход, который будет понятен всей команде. Одним из них является нотация C4, разработанная Саймоном Брауном.

Данная статья — это продолжение и значительное дополнение моей предыдущей статьи по C4, опубликованной в 2023 году. Здесь я детально разобрала для вас каждый уровень и элемент нотации, распространённые ошибки и спорные вопросы, а также инструменты для создания диаграмм, в частности графический редактор Draw.io и Structurizr для создания C4 через код.

Внутри — много схем, картинок и практических примеров для монолитной и микросервисной архитектуры, готовый код Structurizr и промпт для ИИ. Статья организована таким образом, чтобы вы могли открыть её, последовательно пройти все разделы и самостоятельно разобраться с C4.

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

Читать далее

Как AI‑ассистент вырос в production‑систему: путь от NLU к оркестрации и надёжной обработке сообщений

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

Практический разбор архитектуры AI‑ассистента, который постепенно вырос в production‑систему: управление состоянием диалогов, разделение каналов и бизнес‑логики, оркестрация NLU, LLM и ручной поддержки, а также Inbox/Outbox для надёжной обработки сообщений.

Статья показывает, как эти компоненты связались в единый lifecycle пользовательского сообщения и почему архитектура в итоге стала важнее самой AI‑части.

Читать

Падающая сборка, и это я её просил

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели4.2K

Три способа тихо сломать приложение сборкой зависимостей: два пула к базе, не тот кэш, разъехавшиеся ветки конфигурации. Компилятор их не ловит — типы верные. Рантайм-контейнеры ловят половину и приносят свои отказы. Про diogen — compile-time DI для Go: внедрение зависимостей на этапе компиляции, обычный Go-код на выходе, без рантайм-контейнера и без рефлексии.

Читать далее

Что такое RFC, зачем он нужен и как его писать #1

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели9.9K

В этой статье я на пальцах объясню что такое RFC и дизайн документ, почему и как их писать, зачем они нужны, когда их стоит писать, а когда нет и почему их важно писать.

Читать далее

Проблема переполнения Store: настройка самоочистки RocksDB в Kafka Streams

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели6.2K

Одной из сильных сторон Kafka Streams является возможность хранить состояние приложения локально. По умолчанию в качестве локального хранилища используется RocksDB — встроенная key-value база данных, расположенная на диске.

Но есть одна особенность, о которой редко задумываются в начале проекта. State Store отлично умеет хранить данные, но совершенно не знает, когда их пора удалить. Если приложение однажды записало объект в Store, он останется там до тех пор, пока приложение самостоятельно его не удалит. Никакого встроенного TTL для обычного State Store в Kafka Streams нет. На небольших объёмах это практически незаметно.

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

Узнать больше

SpecaFlow — больше чем SDD

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

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

Трудно представить начало сессии с ИИ, в которой модель легко и быстро понимает весь проект и необходимый контекст, чтобы принять от разработчика требования и качественно спроектировать внедрение, не сломав текущее стабильное состояние. Экспертиза инженера‑разработчика или системного аналитика несравненно качественнее — хотя бы потому, что он живёт с ней 24/7.

Читать далее

Модульный монолит в суровых условиях: как я написал фреймворк для производства

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

Всё началось с задачи мониторинга сетевой инфраструктуры и скрипта на python.

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

Внутри: Эволюция, Архитектура, Отказоустойчивость, Федерация, Передача сообщений

Читать далее

Осторожная попытка переосмыслить сложное: Как связать документы, диаграммы и знания?

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

В статье рассматривается архитектурная гипотеза-прототип, предлагающая распределение сущностей по разным слоям и реализацию сквозного связывания между элементами различных canvas-пространств. Через призму теории о: компонентных систем управления контентом (CCMS) и баз знаний нового поколения (LLM-wiki), решая проблему масштабирования визуальных связей в интерфейсах.

Читать далее

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

В Bot API 10.2 добавили subscription. Почему canceled ещё не означает потерю доступа

Время на прочтение4 мин
Охват и читатели6.5K

В Bot API 10.2 появилось отдельное событие для изменений в регулярной подписке — Update.subscription.

Сразу уточню область применения: речь идёт о повторяющихся платежах в Telegram Stars, созданных через счёт бота с subscription_period. Это не то же самое, что нативная платная пригласительная ссылка на канал. Бот получает оплату, а уже наша система решает, какой доступ выдать пользователю.

Внутри Update.subscription находится объект BotSubscriptionUpdated. У него есть пользователь, invoice_payload и одно из трёх состояний:

Читать далее

«Если что, поднимем и разберемся»

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

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

Читать далее

Как я случайно напечатал инфляцию в Discord‑боте и переделал ставки в тотализатор

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

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

Читать далее

Когда продукт считать готовым? Или мы обречены на вечный допил…

Время на прочтение7 мин
Охват и читатели7.7K

Привет, Хабр! (И тебе, случайный читатель, который открыл эту статью в перерыве между двадцатой правкой того, что ты ещё месяц назад гордо назвал финальной версией).

Сегодня давайте без кода и без нытья пофилософствуем на тему:

Когда же продукт готов? И будет ли готов когда-нибудь...?

Читать далее

Непротиворечивая классификация IoC

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели14K

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

Прислушаться к этому источнику

Распилили монолит на 6 сервисов — и случайно собрали распределённый монолит: где мы ошиблись с границами

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели9.2K

Монолит документооборота, менеджмент говорит: «пора пилить на микросервисы». Мы нарезали шесть сервисов, сверху повесили API Gateway, Load Balancer и Circuit Breaker и какое-то время искренне считали, что теперь у нас взрослая распределённая система.

По факту мы собрали распределённый монолит. Те же зависимости, что и в монолите, только теперь по сети — с таймаутами, ретраями и без общей транзакции. Оно работало, спорить не буду. Просто каждая вторая проблема в итоге упиралась в одно и то же: границы сервисов мы провели не там, где надо.

Это не туториал «как правильно резать монолит на DDD-bounded-context за 10 шагов» — таких на Хабре хватает. Это разбор конкретных мест, где границы у нас поехали, в порядке от «это все знают, но всё равно наступают» до «поняли только в проде под нагрузкой». Если вы сейчас режете свой монолит — читайте как чеклист. Если уже прошли — сверьте, сколько совпало.

Дисклеймер: проект под NDA. Названия сервисов, домен и детали обобщены и изменены, часть цифр округлена. Сами грабли и порядок, в котором мы на них наступали, — настоящие.

Читать далее

Я написал игру так, что её правила не знают про Three.js. Объясняю зачем

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

В моей игре доменный слой не знает, что существует Three.js. И Rapier. И DOM.

Звучит как оверинжиниринг для платформера, где уровень проходится за полторы минуты, - и наполовину это правда. Но одна вещь окупила всё: e2e-тесты перестали мигать, потому что симуляцию стало можно прокручивать синхронно, не завися от скорости отрисовки.

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

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