engineering

CQRS with a separate read store: useful projections, new guaranteesPublished At:

A separate read store lets a query model match its screen or report instead of the write model. It can remove expensive joins and let read traffic scale independently.

The new boundary also creates a synchronization problem. Reads can be stale, projections must recover safely, and the system has to state what a user should expect after a command.

engineering architecture #architecture #cqrs #projections #eventual-consistency #dotnet #csharp

Read more ...

Minimal CQRS: separate code paths, keep one application and one databasePublished At:

Minimal CQRS keeps commands and queries in one deployed application using one database. The paths differ because commands protect state changes while queries return data shaped for a caller.

This retains transactions and immediate reads after a command. It does not provide independent read scaling, denormalized reporting projections, or isolation from a busy write workload.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...

CQS and commands: make the application understand intentPublished At:

A changed DTO can show a new state without naming the action a user asked the application to perform. A command such as `DeactivateInventoryItem` makes the action and required reason visible.

That gives validation, authorization, state rules, and later consequences one place to live. CQS is a small API rule, not a requirement for separate services, databases, or an event bus.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...

When CRUD stops describing the workPublished At:

CRUD is a good fit for simple data changes such as a display name or team setting. It becomes vague when an edited DTO hides the action, rules, permissions, and consequences behind changed fields.

The post traces the move from generic updates to CQS and CQRS. The point is not replacing every update, but naming business actions when the application needs to understand them.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...

Async, concurrency, and parallelism are differentPublished At:

Async, concurrency, and parallelism answer different questions. Async avoids blocking during I/O waits, concurrency keeps independent operations moving in the same period, and parallelism spreads CPU-bound calculations across cores.

The distinction guides the implementation: use async for external waits, concurrency when independent waits can overlap, and parallelism only after measurement identifies a CPU bottleneck.

engineering software-development #csharp #dotnet #async #concurrency #parallelism

Read more ...

Why async programming existsPublished At:

Async code yields while I/O waits on a database, network, file system, timer, or remote service. The external operation takes the same time, while the application can keep a UI responsive or serve other work.

This is different from parallel computation. Async improves how waiting is handled; it does not remove the underlying I/O delay or make CPU-bound work faster by itself.

engineering software-development #csharp #dotnet #async

Read more ...

Three Ways to Clean Up Local Git BranchesPublished At:

Local Git branches accumulate after pull requests merge, remotes disappear, or experiments end. This post compares pruning branches whose upstream is gone, removing branches merged into an integration branch, and starting fresh.

Each command has a different safety boundary. The examples use Git’s branch state rather than names alone, and explain when a destructive cleanup is appropriate instead of treating deletion as routine.

engineering #git #developer-productivity #workflow

Read more ...

Building This Blog Without Building a CMSPublished At:

Markdown files hold English and Persian posts, projects, and front matter. Editable HTML templates provide the site shell, while Node 24 and TypeScript build static pages without a database, CMS, or frontend framework.

The generator creates localized routes, indexes, metadata, redirects, static Mermaid output, a sitemap, and robots.txt. Matching translations share `translationOf` values, so the build can link language versions without duplicating routes.

engineering #typescript #static-site #web-development

Read more ...