architecture
architecture
architecture
Messaging problems and solutions you should know before going to production
Messaging looks clean on a diagram and gets messy in production. Duplicate messages, slow consumers, fat events, DLQs used as trash cans: what each problem really costs and the patterns (idempotency, event design, async UX) that keep a broker-based system honest.
engineering
21 engineering lessons for real teams
21 engineering lessons that survive contact with production: why simple code beats clever code, technical debt as a communication problem, what actually builds trust in teams, and how senior engineers pick problems. Field notes for real teams, not conference slides.
Latest
Forget about technical debt and finally start delivering
Technical debt is not the real enemy: cognitive load is. Why messy abstractions hurt because of what they do to your brain, how the database quietly kills flow, and how to stop chasing code cleanliness for its own sake and start delivering again.
How to serve 800 million users without database sharding?
OpenAI serves over 800 million weekly ChatGPT users without database sharding. Inside the architecture: a single primary PostgreSQL, cascading read replicas, aggressive caching against thundering herds, and connection pooling pushed to its limits.
Zanzibar authorisation system by Google
Zanzibar is how Google authorises billions of shared resources across Drive, YouTube and Calendar. A look at its relationship-based data model, the new enemy problem that forces strict consistency, and the Leopard system that keeps checks fast.
Your system is not unique - The power of business archetypes
Business archetypes prove your 'unique' domain is usually a store selling something unusual. Map complex requirements onto universal building blocks: product catalogue, orders, entitlements, inventory for services, party and billing, and stop reinventing the wheel.
Microservices are not just technology - how not to build a distributed monolith?
A distributed monolith is what you get when microservice boundaries are drawn wrong. How to design autonomous modules in three phases: business analysis for boundaries, tight communication contracts, and deployment decisions driven by real architectural drivers.
CUPID - is SOLID slowly becoming obsolete?
CUPID challenges SOLID with properties instead of rules: composable, Unix philosophy, predictable, idiomatic, domain-based. Where the decades-old principles show their age in the cloud era, what 'joyful software' means, and whether SOLID is really done.
How to tame race conditions in read models
Race conditions in read models are the price of parallel event-driven systems. How to handle events arriving out of order: treat the read model as an anti-corruption layer, separate facts from rumours, and build projections that survive an effect arriving before its cause.
How to modularize a system and avoid 'Siamese twins'
Siamese twin modules force a change in one place to ripple into another. How domain leakage and state-transfer events create a distributed monolith, and how contextual modularization with the right communication patterns cuts the connection, without cargo cult.
What is Architectural Kata and why should every dev try it?
Architectural Kata is a flight simulator for system design: practice big architecture decisions in a safe setting instead of waiting years for a greenfield. How a kata session works, six perspectives that change the outcome, and why architecture is communication.
Microservices vs Monoliths: breaking free from architectural dogma
Microservices vs monoliths is a trade-off, not a dogma. Why companies really migrate (team coordination, not speed), the complexity bill that follows, what DoorDash's transformation shows, and how to pick architecture on evidence instead of fashion.
The necessity of architectural advancement
Evolutionary architecture treats change as a design input, not a threat. Why rigid paradigms fail, how to make well-informed architecture decisions, and how identifying architectural drivers and writing fitness functions keeps your system resilient.
Embracing Hexagonal Architecture in Ruby
Hexagonal Architecture separates your business logic from databases, UIs, and external services using ports and adapters. What the pattern really means, a practical Ruby implementation, when it pays off, and the common problems teams hit when adopting it.
Living documentation with the P3 model: A practical guide for engineers
Living documentation stops going stale with the P3 model: define the Purpose (why you document), the Process (how it stays current), and the Product (what readers get). A practical framework for engineers tired of outdated wikis and misleading docs.
What is Frugal architecture?
Frugal Architecture is Werner Vogels' framework for cost-conscious system design: three pillars (Design, Measure, Optimize) and seven laws, from treating cost as a non-functional requirement to continuous optimization, explained with practical examples.
Coupling issues in distributed systems
Coupling in distributed systems goes far beyond shared code: technology, location, semantic, data format, conversation, topology, order, and temporal coupling each hurt resilience differently. What every type looks like and how to keep services independent.
Monolith vs microservices vs serverless
Monolith, microservices, or serverless? A side by side comparison of how each backend architecture handles scaling, development speed, deployment, and cost, where each one breaks down in practice, and a summary that helps you pick the right fit for your project.
Solutions to paginate data in your databse and which one is the best
Database pagination goes beyond LIMIT and OFFSET: ROW_NUMBER(), the FETCH clause, and keyset pagination each behave differently as tables grow. SQL examples for every approach, why offsets get slow on big datasets, and a verdict on which method scales best.
Database shrading and database partitioning in Rails
Database sharding in Rails step by step: create a separate database per shard, wire them up in database.yml, and query across them. Plus how sharding differs from partitioning, with a native PostgreSQL partitioning example done through Rails migrations.
Sample DDD explanation in Ruby with Event-sourcing and Event-driven development
Domain Driven Design in Ruby with a working example: aggregates, entities, value objects, and repositories built around a ProductCatalog, then extended with event-driven design and event sourcing, where projections rebuild state from events instead of a database.