Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Software design philosophy guide based on John Ousterhout's "A Philosophy of Software Design." Use this skill during: code reviews, architecture discussions, API design, module decomposition decisions, refactoring guidance, complexity analysis, naming and commenting improvements, error handling strategy design. Trigger when the user mentions "code is too complex", "how to split modules", "interface design", "reduce coupling", "deep/shallow modules", "information leakage", "error handling", "code
.claude/skills/luoling8192-software-design-philosophy/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 99% | 0% |
> Source: John Ousterhout, A Philosophy of Software Design > Central thesis: The core challenge of software design is managing complexity.
Complexity is anything related to the structure of a software system that makes it hard to understand and modify. Complexity is not the same as system size — a small system can be complex, and a large well-designed system can be manageable.
Think of a module as a rectangle:
Deep module: simple interface, rich implementation. (Good design) Shallow module: complex interface, does very little. (Bad design 🚩)
unset(key) succeeds even if the key doesn't exist — it simply guarantees "after the call, the key does not exist."substring(start, end) auto-clips out-of-bounds parameters instead of throwing.data, result, tmp, info) — carry no useful information.Use these signals during code reviews and self-reviews:
| Signal | Meaning | |--------|---------| | Shallow Module | Interface is nearly as complex as its implementation | | Information Leakage | Same design decision reflected in multiple modules | | Temporal Decomposition | Modules split by execution order, not information hiding | | Overexposure | Common API forces callers to know about rarely-used features | | Pass-Through Method | Method just forwards args to another method with similar signature | | Repetition | Non-trivial code duplicated across locations | | Special-General Mixture | General-purpose and special-purpose code not cleanly separated | | Conjoined Methods | Understanding one method requires understanding another | | Comment Repeats Code | Comment is just an English translation of the code | | Impl Contaminates Interface | Interface docs expose implementation details users don't need | | Vague Name | Name too generic to convey useful information | | Hard to Pick Name | Can't find a precise, intuitive name — design may be flawed | | Hard to Describe | Documentation must be long to be complete — module may be too complex | | Non-Obvious Code | Behavior or meaning of code is not easily understood |
Reference this guide in the following scenarios:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 25,654 | 20,980 | -18% | 1 | 1 | 0% | 3,945 | 5,997 | +52% | 0 | 0 | — |
case-02 | fail→pass | 14,360 | 15,206 | +6% | 1 | 1 | 0% | 2,420 | 5,343 | +121% | 0 | 0 | — |
case-03 | fail→pass | 12,781 | 7,056 | -45% | 1 | 1 | 0% | 2,033 | 3,933 | +93% | 0 | 0 | — |
case-04 | pass→pass | 14,149 | 12,823 | -9% | 1 | 1 | 0% | 2,200 | 4,728 | +115% | 0 | 0 | — |
case-05 | pass→pass | 14,518 | 11,848 | -18% | 1 | 1 | 0% | 2,263 | 4,797 | +112% | 0 | 0 | — |
case-06 | fail→pass | 14,611 | 8,775 | -40% | 1 | 1 | 0% | 2,220 | 4,163 | +88% | 0 | 0 | — |
case-07 | pass→pass | 8,495 | 5,753 | -32% | 1 | 1 | 0% | 1,267 | 3,663 | +189% | 0 | 0 | — |
case-08 | pass→pass | 13,061 | 8,524 | -35% | 1 | 1 | 0% | 2,094 | 4,076 | +95% | 0 | 0 | — |
case-09 | pass→pass | 19,831 | 18,941 | -4% | 1 | 1 | 0% | 3,120 | 5,992 | +92% | 0 | 0 | — |
case-10 | pass→pass | 16,139 | 16,262 | +1% | 1 | 1 | 0% | 2,364 | 5,177 | +119% | 0 | 0 | — |
case-11 | pass→pass | 13,826 | 13,909 | +1% | 1 | 1 | 0% | 2,104 | 5,014 | +138% | 0 | 0 | — |
case-12 | fail→pass | 16,348 | 13,678 | -16% | 1 | 1 | 0% | 2,420 | 4,827 | +99% | 0 | 0 | — |
case-13 | pass→pass | 13,156 | 12,421 | -6% | 1 | 1 | 0% | 2,002 | 4,688 | +134% | 0 | 0 | — |
case-14 | fail→pass | 17,837 | 13,064 | -27% | 1 | 1 | 0% | 2,817 | 4,922 | +75% | 0 | 0 | — |
case-15 | pass→fail | 14,247 | 8,462 | -41% | 1 | 1 | 0% | 2,202 | 4,053 | +84% | 0 | 0 | — |
case-16 | pass→pass | 12,051 | 8,744 | -27% | 1 | 1 | 0% | 1,670 | 4,221 | +153% | 0 | 0 | — |
case-17 | pass→pass | 16,807 | 17,456 | +4% | 1 | 1 | 0% | 2,494 | 5,302 | +113% | 0 | 0 | — |
case-18 | pass→pass | 10,198 | 7,728 | -24% | 1 | 1 | 0% | 1,733 | 3,942 | +127% | 0 | 0 | — |
case-19 | fail→pass | 8,438 | 7,046 | -16% | 1 | 1 | 0% | 1,347 | 3,823 | +184% | 0 | 0 | — |
case-20 | pass→pass | 13,197 | 13,890 | +5% | 1 | 1 | 0% | 2,022 | 4,795 | +137% | 0 | 0 | — |
case-21 | pass→pass | 14,077 | 14,152 | +1% | 1 | 1 | 0% | 2,153 | 4,843 | +125% | 0 | 0 | — |
case-22 | pass→pass | 14,971 | 15,240 | +2% | 1 | 1 | 0% | 2,348 | 5,054 | +115% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.