Ideas from "A Philosophy of Software Design"
Overall reception of “A Philosophy of Software Design”
- Many commenters find it one of the best practical books on software design, especially around modularity, “deep modules,” and thinking explicitly about complexity.
- Others consider it shallow or obvious, or say it covers only “low‑hanging fruit” and skips the hardest design problems (e.g., large, dynamic systems like game engines).
- Several note that you only really “get” it after some real‑world experience; junior devs may benefit but also risk over‑applying rules.
Functional programming (FP) vs the book
- FP‑oriented readers criticize the book for barely addressing purity, mutation, and separation of IO from logic.
- They argue FP (or “functional core / imperative shell”) gives formal, concrete tools for reducing complexity that should be central to any “philosophy of design.”
- Others reply that useful design philosophies need not be formally complete, and that a simpler, more accessible treatment may be more effective for most practitioners.
- Some see FP evangelism itself as quasi‑religious; there’s pushback against the idea that non‑FP developers are “unqualified” to talk about complexity.
Deep modules, APIs, and abstraction size
- A major praised idea: modules should have small, simple public interfaces but “deep” implementations that hide substantial complexity.
- Examples like Unix file IO and garbage collectors are debated: some see them as quintessential deep modules; others argue their true “interface” is large and cross‑cutting, so the example is misleading.
- Several like the guideline of narrowing public APIs and being less dogmatic about short methods; others worry about over‑abstraction (e.g., excessive service classes).
Small methods, Clean Code, and incidental complexity
- There’s substantial criticism of “Clean Code”–style rules (e.g., very short methods, many tiny classes) for leading to fragmented, hard‑to‑navigate code and lifted state.
- Others defend those books as useful for beginners to develop an aesthetic sense and awareness of maintainability, but agree rules must not be followed mechanically.
Examples, testing, and business logic
- Some feel the book’s or article’s examples (e.g., discount services) are oversimplified or even bad: they may mix distinct business concepts (shipping vs order discounts) or introduce unnecessary abstraction.
- Others argue the refactorings improve testability (via injected services and fakes) and demonstrate how to centralize logic as complexity grows.
- Several emphasize that “it depends”: duplication can be acceptable early (WET—write everything twice) until real reuse patterns and divergent requirements emerge.