A Philosophy of Software Design

Stanford professor John Ousterhout addresses the fundamental problem of software design: managing complexity through decomposing systems into modules that can be implemented independently. The book defines complexity as "anything that makes a system hard to understand and modify," identifying dependencies and obscurity as its two primary sources. Ousterhout contrasts tactical programming ("move fast and break things") with strategic programming where "working code is not enough," advocating for deep modules with simple interfaces that hide complex functionality.

9 sections ยท 25 lessons

Course outline

Complexity Fundamentals

  1. Complexity Fundamentals
  2. Complexity Symptoms
  3. Strategic Programming
  4. Complexity Fundamentals

Module Design

  1. Deep Modules
  2. General-Purpose Modules
  3. Different Abstractions
  4. Pull Complexity Down
  5. Unix I/O Design
  6. Module Design

Information Hiding

  1. Information Hiding
  2. Combine or Separate
  3. Prevent Information Leakage
  4. Information Hiding

Error Handling

  1. Eliminate Errors
  2. Error Handling

Design Process

  1. Design Twice
  2. Design Through Modification
  3. Focus on Important Decisions
  4. Red Flags
  5. Design Process

Documentation

  1. Why Comments Matter
  2. Write Better Comments
  3. Choose Good Names
  4. Comments First Design
  5. Documentation

Code Clarity

  1. Consistency
  2. Obvious Code
  3. Code Clarity

Industry Practices

  1. Evaluate Popular Practices
  2. Performance vs Design
  3. Industry Practices

Investment Mindset

  1. Complexity Investment
  2. Investment Mindset

Start learning with Wondering