The Unix/Linux design philosophy as a lens for system design — mechanism vs policy, composability, small tools, text streams, convention over configuration, and the principle of least surprise. Use when evaluating designs for composability, simplicity, or separation of concerns.
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "design-philosophy-linux" 技能: 1. 下载 https://raw.githubusercontent.com/microsoft/amplifier-bundle-systems-design/main/skills/design-philosophy-linux/SKILL.md 2. 保存为 ~/.claude/skills/design-philosophy-linux/SKILL.md 3. 装好后重载技能,告诉我可以用了
The Unix philosophy as a thinking tool for modern system design.
The deepest principle in Unix. The kernel provides mechanisms (process scheduling, file descriptors, memory mapping). User-space provides policy (which processes run, what files mean, how memory is used). The kernel doesn't have opinions about your workflow. It gives you the tools to build any workflow.
The litmus test: Could two reasonable users want different behavior here? If yes, you're looking at policy — don't hardcode it. Provide a mechanism and let the caller decide.
How this applies broadly:
Design evaluation questions:
The failure mode: Over-separating mechanism from policy creates systems that are infinitely flexible and impossible to use out of the box. X11 separated mechanism from policy so aggressively that every desktop environment had to reinvent window management from scratch. The mechanism layer should be opinionated enough to be useful — just not so opinionated that it precludes valid alternatives.
The most cited and most misunderstood Unix principle. grep searches. sort sorts. uniq deduplicates. Each does one thing, does it thoroughly, and handles edge cases within its domain. The key word is well, not small.
What this actually means:
A component should have a clear responsibility boundary. Everything inside that boundary, it handles completely. Everything outside, it delegates. grep doesn't sort its output because sorting is outside its boundary. But grep handles binary files, compressed input, recursive directories, regex dialects, and colorized output — because those are all within "searching text."
How microservices got this wrong: "Do one thing" was interpreted as "be small." Teams created services so thin they couldn't do anything useful alone. A "user service" that only stores user records but can't validate an email address. A "notification service" that can't template a message. The result: every operation requires orchestrating five services, and the real logic lives in the orchestration layer — which is now doing everything and doing it badly.
The real principle: Draw clear responsibility boundaries. A component owns a coherent piece of functionality, not a minimal piece. The question isn't "Is this small enough?" but "If I need to change how X works, do I change exactly one component?"
Design evaluation questions:
…
Catalog of reusable architectural primitives — boundaries, contracts, state machines, queues, caches, consistency models, and more. For each: what it is, when it's right, when it's WRONG. Use when selecting patterns for a design or evaluating whether a pattern fits.
Domain-Driven Design as a lens for system architecture — bounded contexts, aggregates, ubiquitous language, context mapping, domain events, and strategic vs tactical patterns. Use when modeling complex business domains, defining service boundaries, or evaluating whether a system's structure reflects its domain.
Object-oriented design principles as a lens for system architecture — SOLID, composition over inheritance, the actor model, design patterns (and when they're wrong), encapsulation, polymorphism, and responsibility-driven design. Use when evaluating code organization, module boundaries, or object/component relationships.
Domain patterns for Azure cloud architecture — compute selection, managed services, identity (Entra ID), networking, data platform, messaging, deployment, cost management, and operational patterns. Use when designing or evaluating a system deployed on Microsoft Azure.
Domain patterns for CLI tools and developer SDKs — command structure, configuration layering, plugin architecture, distribution, backward compatibility, shell integration, and failure modes. Use when designing or evaluating command-line tools, developer platforms, or SDK libraries.
Adversarial review of a system design from 6 critical perspectives -- SRE, security, staff engineer, finance, operator, and developer advocate. Produces a unified risk assessment. Use for INTERACTIVE on-demand reviews during a design conversation (/adversarial-review). For RECIPE-DRIVEN reviews (where prior step context is needed), use the systems-design-critic agent instead.