Skip to main content

Command Palette

Search for a command to run...

Architecture Principles

This is a living document.

It evolves as systems evolve.

These principles shape every article on this blog and every architectural decision discussed here.

They are not rules. They are constraints chosen intentionally.


1. Prefer Event-Driven Over Polling

Time-based systems are predictable. Event-driven systems are responsive.

Polling asks: “Has something happened yet?”

Events say: “It just happened.”

Polling increases load. Events increase clarity.

Use cron when time itself is the requirement. Use events when change is the requirement.

If your system checks every minute “just in case,” you may be compensating for missing architecture.


2. Optimize for Cognitive Clarity

A system that works but cannot be understood is already broken.

Clarity scales. Cleverness does not.

Architectural decisions should reduce:

  • Mental overhead
  • Hidden coupling
  • Implicit behavior
  • Surprising side effects

If a new engineer needs a diagram and a meeting to understand a feature, the system is too complex.

Readable systems outlive smart systems.


3. Design for Change, Not Perfection

Perfection is static. Software is not.

Architectural elegance that cannot adapt becomes technical debt.

Design for:

  • Extensibility over rigidity
  • Reversibility over finality
  • Isolation of responsibilities
  • Clear boundaries

The question is not: “Is this perfect?”

The question is: “Can this evolve safely?”


4. Every Pattern Has a Cost

Queues introduce latency. Events introduce complexity. Cron introduces waste. Abstractions introduce indirection. Microservices introduce coordination overhead.

There is no free architecture.

Every design decision is a trade-off between clarity, scalability, and operational cost.

Make the trade-off explicit.


5. Simplicity Is a Strategic Choice

Simplicity is not minimalism for its own sake.

It is the intentional reduction of accidental complexity.

Simple systems:

  • Fail predictably
  • Scale incrementally
  • Are easier to debug
  • Require fewer meetings

Simplicity is not lack of ambition. It is disciplined focus.


6. Avoid Accidental Distributed Systems

If your feature requires:

  • Retries
  • Backoff strategies
  • Dead-letter queues
  • Cross-service coordination

You are no longer building a feature. You are building distributed infrastructure.

Sometimes that’s necessary. Often it’s accidental.

Architect consciously.


The Purpose of This Playbook

These principles are not about style.

They are about longevity.

Software should survive:

  • New requirements
  • New engineers
  • New infrastructure
  • And time

The goal is not to build impressive systems.

The goal is to build systems that make sense.