Common System Design
ASecurityTo implement common system design best practices, start by designing around clear boundaries instead of around frameworks or infrastructure details. First, identify the bounded contexts in the problem space and give each module one clear responsibility. A good default is a layered or clean architecture: presentation handles transport and input mapping, application/use-case logic coordinates behavior, and infrastructure handles persistence and external systems. Dependency direction should poin...
- 549 stars
- 0 votes
- 0 copies
- 2 views
- Added June 6, 2026
Works with
Security analysis
100/100Pro scans all 4 files and shows the line behind each finding
npx -y skills add HoangNguyen0403/agent-skills-standard --skill common-system-design --agent claude-codeAre you the author of Common System Design?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-common-system-design)To implement common system design best practices, start by designing around clear boundaries instead of around frameworks or infrastructure details.
First, identify the bounded contexts in the problem space and give each module one clear responsibility. A good default is a layered or clean architecture: presentation handles transport and input mapping, application/use-case logic coordinates behavior, and infrastructure handles persistence and external systems. Dependency direction should point inward, so the core logic depends on interfaces, while databases, queues, and HTTP clients implement those interfaces. That keeps the business logic testable and prevents framework concerns from leaking across the whole system.
Next, optimize for high cohesion and loose coupling. Put related behavior together, avoid “god modules,” and communicate across module boundaries through stable interfaces or contracts. Use dependency injection rather than hardcoded concrete implementations. For distributed components, choose the communication style intentionally:
- Synchronous calls when the caller needs an immediate answer.
- Asynchronous events or queues when decoupling, resilience, or throughput matter more.
- Hybrid designs when a request needs an immediate acknowledgment but follow-up work can happen later.
For distributed systems, make the trade-offs explicit. Since partition tolerance is unavoidable, decide whether a component should favor consistency or availability under failure. Strongly consistent workflows such as payments or configuration changes usually need CP-oriented behavior. User-experience-oriented features such as carts, feeds, or session caches often tolerate AP behavior with eventual consistency.
Build resilience into the design from the start. External calls should fail fast, not hang indefinitely. Use timeouts, retries only for idempotent operations, circuit breakers for unstable dependencies, and bulkheads so one failing integration cannot exhaust all resources. If a secondary dependency fails, the system should degrade gracefully and preserve the core user journey whenever possible.
Data and API design matter too. Keep a single source of truth for important data, version APIs and schemas when contracts may evolve, and design writes to be idempotent so retries or duplicate deliveries do not corrupt state. If the system is eventually consistent, define how conflicts are resolved and how users get safe read behavior such as read-your-writes when needed.
Finally, document major architectural choices. A short architecture decision record should capture the bounded contexts, dependency direction, communication pattern, CAP trade-off, and resilience strategy. That turns system design from tribal knowledge into an explicit, reviewable design.
In practice, a solid checklist is:
- Clear module boundaries and responsibilities
- Inward dependency flow and interface-based seams
- Intentional sync vs async communication
- Explicit consistency/availability trade-offs
- Idempotency and versioning for change safety
- Fail-fast and graceful-degradation behavior
- Lightweight design documentation for future evolution
If you apply those consistently, the system becomes easier to test, scale, evolve, and recover when parts fail.
Files in this skill
- SKILL.md
- references/distributed-systems.md
- references/implementation.md
- references/resilience-patterns.md
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.