Skip to content

Software Principles

Each page below describes one principle you can use to guide your software engineering work.

Higher Judgment & Direction

Designing Solutions

  • Separate Concerns - No component should solve multiple sub-problems, and no sub-problem should be solved by multiple components.
  • Design Incrementally - Design for your current problem, break it down clearly, and design for incremental construction.
  • The Automation Spectrum - Automation is a ladder, you have to start at the bottom.
  • Leaf vs Root Problems - Distinguish between symptoms and causes. Fix the root to eliminate many leaves.
  • O(1) Effort per Change - As the number of already-supported functionalities increases, your cost to make changes should grow as little as possible.
  • If They Can, They Will - If the system permits an action, assume it will happen.
  • Boring is Good - Choose boring technology for critical infrastructure.
  • Do Not Repeat Yourself - Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.
  • Modular Design - The most important tool for managing software complexity is the module.
  • Minimize Dependencies - Dependencies are liabilities, not free functionality.

Code Quality

  • The Rule of Two - You can copy code once. When you need it a third time, you must refactor.
  • Tests Or It Isn't Done - A feature is not complete until you can prove it works and ensure it keeps working.
  • Isolate Tests - Tests should not depend on each other or the environment.