“A Philosophy of Software Design” by John Ousterhout

What is good software design?
Can 10x programming be taught?
Practice is the major component in being good
Most profs aren’t going to teach good design and coding; they don’t have coding experience

Teaching Software Design Through Iteration (CS 190 at Stanford)


Fight Against Complexity

Design Concepts Taught

Classes Should Be Deep (or Modules, Functions, any layer really)


Shallow Classes/Abstraction

Deep Abstraction

Goes Against Functions/Classes Should Be Small

Define Errors Out Of Existence i.e. eliminate exceptions as much as possible

[Overall disagree on this one, it seems this just leads to side effects as the “right behavior” is not always obvious, possibly hiding errors or states that should not be hidden within the contract of the abstraction. Maybe the idea is to build the abstraction to prevent this, or that clearly defines the right-behaviors but that’s another thing entirely.]

Mindset of Strategic vs Tactical Programming

Tactical programming:

Tactical tornadoes:

Strategic programming:

Tactical mindset pays off in short-term only

How much slower is tactical over how much time, how fast will strategic catch up? What time frame is short-term? Cannot say for sure but data-less opinion is 6-12 months. [conversely, a small (truly) throw-away project will benefit from a tactical mindset]

How Much to Invest?

Startup Pressure for Tactical Mindset

Facebook example:

Can also succeed with good engineering: