Notes on reading the book from by John Ousterhout
Chapter 1 - Introduction (It’s All About Complexity)
- the goal of software design is to limit complexity, which increase over time and with amount of people working on the project
- two approaches to fight complexity
- we can make code simpler (e.g. by eliminating edge cases)
- we can encapsulate complexity so that we don’t have to worry about it
- software is mallaeble, so unlike physical systems can be iterate on and everything doesn’t have to designed fully (agile not waterfall)
Chapter 2 - The Nature of Complexity
- Complexity is a structure of a software system which makes it hard to understand and modify the system
- System is complex when:
- Difficult to make predictable changes
- Cognitive overload - need to understand a lot about a system
- Unknown unknowns
- complexity determine by most common activities, if parts of the system complex but they don’t need to be touched often, that’s fine, so isolating complexity to places where it’ll never be seen is almost as good as eliminating it
- complexity is caused by dependencies and obscurity
- dependencies are needed (e.g. api or function signature) but we should limit them and make them as simple as possible
- obscurity is an important information not obvious, e.g. vague variable name
- complexity is incremental
Chapter 3 - Working Code Isn’t Enough (Strategic vs Tactical Programming)
- tactical programming - main focus get something working as quickly as possible, at whatever cost
- strategic programming - main focus is to produce great design most important the long term structure, requires an investment mindset
- best is to make lots of small investments on a continuation basis