Architecture Atlassoftware · systems · evidence
Software · Systems · Quality · EvolutionView Markdown source

Architecture anti-patterns and failure smells

An anti-pattern is a recurring response that looks attractive but produces harmful consequences in context. Names are useful only when they lead to diagnosis and a safer migration.

Core ideas and patterns

Idea What it solves Cost, limit, or warning
Big ball of mud Signals boundaries and ownership have eroded A rewrite without domain learning repeats it
Distributed monolith Services deploy or fail together despite network boundaries More infrastructure does not create autonomy
Shared database Lets services bypass owned contracts Sometimes valid for modules, dangerous for claimed autonomy
Chatty interface Requires many fine-grained remote calls Latency and partial failure multiply
God service/object Centralizes unrelated policy and knowledge Splitting by method count misses domain cohesion
Golden hammer Uses one familiar technology for every force Standardization can hide mismatch
Resume-driven architecture Optimizes learning novelty over system need Long-term operational cost remains
Vendor lock-in panic Builds abstractions for imaginary portability The abstraction can cost more than migration
Cargo-cult microservices Copies topology without its forces Teams inherit distributed complexity
Lava flow Leaves dead or half-understood paths in place Removal requires usage evidence and ownership
Architecture astronaut Creates abstractions far above concrete needs Vocabulary grows while delivery slows
Single point of human failure Depends on undocumented expert knowledge Redundancy must include people and procedure

How to apply it

Describe the observed consequence before applying a label. Map dependencies, co-change, failure propagation, ownership, data access, and release coordination. Identify the smallest boundary or contract that can be recovered. Migrate with characterization tests, telemetry, strangling, and explicit deletion.

Evidence, not opinion

Measure cross-service release coupling, cyclic dependencies, shared-table access, remote call count, incident blast radius, bus factor, unused code paths, and time to understand a change.

Small example

Ten “microservices” share one schema, release train, library version, and synchronous chain. The corrective goal is independent capability ownership; merging some services may be the fastest path.

Feynman check

Explain the design to a new engineer without using the pattern names. State the problem, the forces that conflict, the chosen boundary or mechanism, what can fail, and the evidence that would prove the choice still works.

Architecture AtlasIndependent study material · verify standards at their primary sources