Тема: architecture
-
Конвейер, fan-out, оркестратор и коллегия критиков: какой паттерн мультиагентной системы подходит для какой задачи
Конвейер подходит для задач с фиксированной последовательностью преобразований; параллельный fan-out — для независимых подвопросов или для нескольких попыток, по которым потом проводится голосование; оркестратор с воркерами — для задач, чья декомпозиция становится известна только во время выполнения; коллегия критиков — для результатов, которые нужно проверить по нескольким критериям; каждый из этих паттернов увеличивает расход токенов и добавляет уровень координации, который может дать сбой сам по себе.
-
DACI и RACI для технических решений: один утверждающий, поимённые участники
DACI называет драйвера, который ведёт процесс принятия решения, единственного утверждающего (approver), который его принимает, участников (contributors), у которых есть голос, но нет права вето, и информируемых (informed), которые узнают об итоге. RACI распределяет по задачам роли ответственного за исполнение (responsible), подотчётного (accountable), консультируемого (consulted) и информируемого (informed). Обе модели работают для технических решений, если роли зафиксированы письменно до начала обсуждения.
-
Соглашения внедрения зависимостей в .NET: время жизни, области видимости и ловушка captive dependency
Microsoft.Extensions.DependencyInjection регистрирует сервисы в IServiceCollection со временем жизни transient, scoped или singleton и внедряет их через публичные конструкторы; задокументированные правила гласят: никогда не внедрять scoped-сервис в singleton, позволять контейнеру самому освобождать то, что он создал, избегать вызовов в стиле service locator и включать валидацию областей видимости, чтобы captive dependency обнаруживалась ошибкой при старте, а не утечкой состояния между запросами.
-
Event sourcing and CQRS: what they buy and what they cost
Event sourcing stores every state change as an immutable event and derives current state by replay; CQRS separates the write model from read models. Both add auditability and flexibility at the price of complexity and eventual consistency.
-
Go или Rust для нового сервиса: процедура выбора без бенчмарков
Выбирайте Go или Rust для сервиса по документированным свойствам языков и ограничениям команды, а не по мифам о бенчмарках: модель управления памятью, стиль обработки ошибок и конкурентности, характер нагрузки, необходимые библиотеки для взаимодействия и люди, которые будут сопровождать сервис через два года.
-
Technische Schulden als bewusste Entscheidung mit Buchführung
Cunninghams Metapher: Nicht ganz richtiger Code ist ein Kredit, jede Minute Mehrarbeit daran ist der Zins. Die Metapher trägt nur, wenn die Schuld bewusst aufgenommen, notiert und regelmässig bewertet wird; als Sammelbegriff für alles Unschöne oder als Entschuldigung für Schlamperei ist sie wertlos.
-
Выбор инструмента или навыка моделью решений: Choice для ранжирования, Noul для отказа от выбора
Почему Choice по кандидатам-инструментам отвечает на относительный вопрос «какой подходит лучше всего», а Noul для каждого кандидата — на абсолютный «нужен ли вообще инструмент на этом ходе», и как руководство TypeSafe по предложению навыков сочетает оба типа для каталога из 182 навыков: первый запрос ранжирует все, второй читает трёх лидеров и может отвергнуть их всех.
-
File upload service walk-through: direct-to-storage tickets, asynchronous scanning and quotas
A design walk-through for uploads that bypass the application servers: a ticket that reserves quota and returns a signed upload URL, a completion step that verifies the stored object, a scan worker that promotes or deletes it, lifecycle rules for abandoned uploads, and a status model that explains every stored object.
-
Notification service walk-through: channels, preferences, delivery attempts and retries
A design walk-through for a multi-channel notification service: an ingest API with an idempotency key, a router that expands one notification into per-channel deliveries after checking preferences, per-channel queues and retry schedules, callback handling for invalid tokens, and what to defer.
-
Хранение производных данных в PostgreSQL: генерируемые столбцы и материализованные представления
Генерируемый столбец выводит одно значение для каждой строки только из неё самой: виртуально (при чтении) или с хранением (при записи), используя лишь неизменяемые выражения. Материализованное представление хранит результат любого запроса и актуально лишь на момент последнего REFRESH. Для индексируемой нормализации строк используйте хранимые генерируемые столбцы, для дорогих агрегатов с допустимым отставанием — материализованные представления, а если оба варианта не подходят — поддерживаемую сводную таблицу.
-
Проектирование памяти агента: что сохранять, что обобщать и что забывать
Память агента имеет три уровня: контекстное окно, рабочие заметки задачи и долговременное хранилище между сессиями. Для каждого элемента определяйте подходящий уровень, делайте долговременную память небольшой и проверяемой и удаляйте то, что перестало быть верным.
-
Server-Sent Events и WebSocket: сравнение
Server-Sent Events передают текстовые события от сервера клиенту по обычному HTTP с автоматическим переподключением и идентификаторами последних событий. WebSocket предоставляет двунаправленный канал с поддержкой двоичных данных и собственным протоколом. Выбирайте SSE для односторонних обновлений, а WebSocket — когда клиенту нужно часто отправлять данные.
-
Abstaining as an agent: when not acting is the correct output
An agent's output space should include a deliberate 'not decided' for every automated action: what abstention is, why a classifier or agent without one converts every unclear case into a wrong action, and how to build abstention in through explicit options, floors on confidence, stakes-dependent thresholds and a route for what was abstained from.
-
When does client-side routing still pay off now that browsers offer bfcache, prerendering and cross-document view transitions?
Open question: in-page routers were adopted to avoid full page loads, at the cost of shell serving, 404 handling, scroll and focus restoration and a bundle that must arrive first; the back/forward cache, the Speculation Rules API and cross-document view transitions now address the original motivations in multi-page sites. For which sites and interaction patterns does an in-page router still measurably win?
-
At what repository size do teams need monorepo build tooling beyond plain Git?
Open question: sparse checkout, partial clone and per-directory CI filters cover the first stage of a growing single repository; at which size, team count or build time have teams found that a build graph tool with remote caching became necessary, and what did the transition cost?
-
Выбор между потоками, процессами и asyncio для нагрузки Python
Сначала определите характер горячего пути: для ожидания ввода-вывода подойдут asyncio (много соединений, асинхронные библиотеки) или пул потоков (немного блокирующих вызовов); для вычислений на чистом Python нужны процессы или сборка без GIL; нативный код, освобождающий GIL, может использовать потоки. Ограничивайте каждый пул, явно выбирайте способ запуска процессов и прописывайте завершение работы.
-
URL shortener walk-through: key generation, redirect status and abuse controls
A design walk-through for a URL shortener: random base62 keys with collision retry, a redirect path that touches one cache and one store, 302 rather than 301 when targets must stay revocable and countable, creation-side abuse checks, and a list of what not to build first.
-
Записи об архитектурных решениях
Запись об архитектурном решении фиксирует одно значимое решение: его контекст, само решение, статус и последствия. Это короткий файл, который хранится вместе с кодом.
-
Caching in Anwendungen: Ablaufzeiten, Invalidierung und Schutz vor dem Ansturm
Ein Anwendungs-Cache hält abgeleitete Daten und darf jederzeit verloren gehen; korrekt bleibt er nur durch bewusste Invalidierung: Ablaufzeit je Datenklasse, Löschen statt Überschreiben beim Schreiben, Versionskennung im Schlüssel und eine Sperre gegen gleichzeitiges Nachladen heisser Schlüssel.
-
ETL versus ELT: where the transformation runs and what that changes
ETL transforms data in a separate engine before loading it into the target; ELT loads raw data first and transforms it with the target store's own processing. The choice decides where compute is paid for, what raw data lands in the warehouse, and how easily a transformation can be rerun.
Машиночитаемо: JSON