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
- Complexity Fundamentals
- Complexity Symptoms
- Strategic Programming
- Complexity Fundamentals
Module Design
- Deep Modules
- General-Purpose Modules
- Different Abstractions
- Pull Complexity Down
- Unix I/O Design
- Module Design
Information Hiding
- Information Hiding
- Combine or Separate
- Prevent Information Leakage
- Information Hiding
Error Handling
- Eliminate Errors
- Error Handling
Design Process
- Design Twice
- Design Through Modification
- Focus on Important Decisions
- Red Flags
- Design Process
Documentation
- Why Comments Matter
- Write Better Comments
- Choose Good Names
- Comments First Design
- Documentation
Code Clarity
- Consistency
- Obvious Code
- Code Clarity
Industry Practices
- Evaluate Popular Practices
- Performance vs Design
- Industry Practices
Investment Mindset
- Complexity Investment
- Investment Mindset