
9/10 – Great book that ties together many news stories you will have read about over the years.
Ramblings on Big Data, Books, Tech..

9/10 – Great book that ties together many news stories you will have read about over the years.

Overall: 8/10
I can recommend a Philosophy of Software Design Paperback by John Ousterhout. I’ve been programming for 15 years and it closely parallels my own current beliefs about programming. He stands above the lower aspects of programming/code/modules, raising the discussion to a conceptual level, that you seem to be wanting. If I had read this 10 years ago I may have marked it higher but after 15 I’ve already learnt a lot of it through pain. I would keep on ehandy in the office to help me with explaining reasons to junior developers during code reviews.
Book Notes:
Chapter 1/2 – It’s all about complexity.
Formula on page 6 I rougly agree with.
i.e. “complexity is determined by the activities that are most common.” If a system has a few parts that are very complicated but they never need touched, that doesn’t much affect the overall complexity.”
Total Complexity = Sum[ componentComplexity x timeSpentWorkingOnThatPart]
I think his formula for overall complexity is mostly correct: Total Complexity = Sum[ componentComplexity x timeSpentWorkingOnThatPart] However I would replace the timeSpentWorkingOnThatPart with the sum of the square roots of all separate times. i.e. Working on a component for 2 days straight versus working on it 1 hour every 2 weeks are quite different.
Symptoms of Complexity
Chapter 3 - Strategic vs Tactical
Tactical = Main focus is on getting something working quickly.
Strategic = Working code isn’t enough. Most important is long term system structure.
How much to invest? If all you do is tactical, you build up complexity and code debt which eventually slows you down:

Chapter 4 – Modules should be deep
Abstraction -> Simplified view of an entity, which omits unimportant details.
Deep Modules – The best modules are deep, they provide powerful functionality yet have simple interfaces.
Shallow modules = Classitis = separate functions for everything.

Thoughts…surface area should be connected molecules. With dependencies being thickness of connections? Consider how refactoring would look visually as molecule changes.
Chapter 5 – Information Hiding
Information leakage – (Opposite of hiding) is when a design decision is reflected in multiple modules creating a dependency.
Temporal Decomposition – When methods must be called in a particular order. Great to finally get a name for this.
Chapter 6 – General Purpose modules are Deeper
Counter-intuitively, “code that is more general purpose is simpler, cleaner and easier to understant.” (Thoughts: this took me years to realise and value!! See Iverson APL )
(Some) Generality leads to better information hiding.
Create general class then push specialization up or down to calling classes.
Chapter 7/8/9
Pass-through methods = Red Flag = No clean separation of responsibility.
Decorators e.g. the old java bufferedInput(FileInput()) is an example of this.
Repetition = Red Flag
Special / General code mix = Red Flag
Pg 61. The amount of complexity exposed to users should be related to number of users to number of developers.
Chapter 10 – Define errors out of existance
His example is unix vs window file deletion. Unix takes care of it in background. Windows refuses and says directory/file is blocked.
Example from my own experience is returning empty lists instead of nulls.
Chapter 11 – Design it twice
Consider multiple approaches, outline them and document pros/cons and which one was chosen and why. (I always do this and make the notes inline or bigger ones in an architecture file. Now that he mentions it I’ve never seen anyone else do this. Crazy they don’t! I guess it does happen in PRs but that’s too late)
Comments – Should describe something that isn’t obvious from the code. it should either be a lower or higher level than the code it’s at.
Pg116 Cross module contents = architecture decisions. Thoughts: Should I create fake global variable and link cross comments using them. Ensure link stays valid.
Chapter 14 – Naming
Chapter 15 – Write the comments first
Chapter 16 – Modifying existing code
Chapter 17 – Consistency – Great point!! I’ve learnt how important being consistent in a code base is over many years of pain. Even if the code is not optimal for that area, there’s value in it all being the same pattern everywhere! Only add new if willing to change all other similar parts.
Chapter 20 – Performance = Measure
I have read this book, went through the exercises and went back to reference this book a number of times.
It’s 10/10 excellent
but I confess I almost forgot to write a review as I mostly read it online and only bought the (heavy book. See pic) to make sure the author got paid for his brilliant work.
Summary: “A comprehensive introduction to writing an interpreter for a dynamically typed, object-oriented toy programming language (Lox). Throughout the book the author develops two complete interpreters for the language from start to finish, including all the front-end and backend parts. The first is a simple AST walking interpreter implemented in Java, and the second is a moderately optimized VM written in C, including a garbage collector.” (src)

Batteries Included = Comes together with all possible parts required for full usability
Every developer should:
I confess I didn’t arrive at this book naively. I have previously taken 1 university course on compilers and implemented parts of a language naively, i.e. just having a go without any advance thought. If possible I would recommend “having a go” first as it will truly make you appreciate how great this book is.
Robert Nystrom gently leads you down the garden path of creating an interpreter in java and then in C. Even with no C/java experience I think most people could follow along. In fact a major positive of the book is that all code is covered in the book. In theory and mostly in practice I did this. I implemented the language as I followed the book. I wasn’t making his lox language but every step he showed was applicable and useful.
Since I’ve been writing a language on/off for a few years and recently stumbled upon the book. I’ve been particularly interested to read the parts of the book I’ve already implemented to see how someone else approached or thinks about the problem. It has been highly amusing, Robert has some keen insights and his diagrams are brilliant!
If you are a programmer buy this book and more importantly follow it to implement a language that interests you.
The insight it will give you long term is invaluable.
Link to referenced summary: https://eli.thegreenplace.net/2022/book-review-crafting-interpreters-by-robert-nystrom/
Bonus Points: +1 for the author as I emailed them in 2020 when I read the book and they gave a detailed reply to a particularly niche query. Thanks Bob.
Overall: 9/10
I orginally purchased this book in July 2016 and I’ve returned to it throughout the year to re-read sections and twice to re-read it fully. Contains a simple approach that forces developers like me that typically prefer development to sales to
a) Realise the importance of distribution
b) Apply an engineering approach to achieve that.
Book Notes:
Traction = Quantitive evidence of customer demand.


Middle Ring – For each construct a cheap test.
“When testing, you are NOT trying to get a lof of customers. You are simply trying to determine if it’s a channel that could move the needle for your startup.”
Chapter 4 – Traction Testing
Chapter 5 – Critical Path
See also: https://chrisgimmer.com/marketing-flywheel/
2023 May – Additional Notes Update
Sales
BANTP – Budget, Authority, Need, Timing, Process
6/10 – Overall. 8/10 for early chapters, 4/10 for later chapters.
The first 100 pages were excellent but the later chapters were a mixed bag, partially due to rotating authors. I skim-read the later chapters as they mostly focussed on a broad spectrum of not closely related topics.
Chapters that covered topics I interact with were too shallow to interst me, while many chapters were not of interest to me. Perhaps if I was an SRE rather than a developer I would have found the entire book better.
n support team has typically been tasked with “zero outages” whilst the developers are incentivised to develop and release as quickly as possible, with some front-office “quant-devs” not being held accountable for stability at all. With the handover method looking like throwing it over a wall:
ibilities back and forth from DEV to SRE owned. Importantly the target e.g. between 99.8% and 99.9% uptime should have an upper and lower bound, it should NOT be an absolute. If you go above it, developers should be taking more risks, below, developers should work on stability.Note the full book is actually available online here.
An outage is NOT a bad thing, it is an expected part of innovation.
Automation allows super-linear scaling of users vs human effort.
The later chapters held less of interest.
“You want a data recovery system NOT a data backup system.”
SRE Engagement Model – Not all services require SRE attention as they don’t need high reliability and availability. Those teams get given advice and documentation.
Overall 8/10 – Good book that presents good ideas and clear evidence for why.
I was aware of slightly over half the best practices from this book but not all of them have been adopted by large firms. I picked up a few actions I’d take away but really the usefulness in this book may be in presenting it as evidence to try and drive change in others.

Culture Types:
Goal is loose coupling to ensure bandwidth between teams isn’t swamped with implementation details.

Can the team by itself without speaking to outsiders:
– Change architecture significantly
– Do a deployment? now? during business hours? anytime?
Critical = Tesability and Deployability
Systems are loosely coupled and can be developed and validated independently.
CAB – doesn’t work to increase stability!
External approvals are negatively correlated with lead time, deploy freq. and restore time.
Lean Management <-> Software delivery performance, becomes a virtuous cycle.
Lean: Build -> Measure -> Learn
Factors Causing Employee Burnout:
On Holiday I took an unusual diversion to read three US political books:
Reagan – Was very biased in favour of Reagan and what a great job he had done.
James Comey – Felt like James honest version of the truth as he saw it, very anti-trump. Some of the situations presented and how everyone tries to manage events to get what they want are interesting.
McCain – Was probably the most balanced book with a few more interesting stories. The best of the bunch.
Overall 5/10 – An OK book with little surprising content and an OK story.

I think the core content is true, but the narrative that the author tried to use to deliver his points was thin and didn’t resonate with me.
The one thing this book reminded me of was the interesting research google performed analysing their teams. Over “two years we conducted 200+ interviews with Googlers (our employees) and looked at more than 250 attributes of 180+ active Google teams”, interestingly if you look at their five points (listed 1-5) it closely parallels this book (image below).

Each level relies on the one below. A team must first have trust, then no fear of conflict, then commitment to team goals, hold themselves accountable and be commited to team results.
Overall 6/10 – Good but the few good ideas didn’t justify the book size, some parts felt like filler.

I liked the idea of this book as a number of processes that I am responsible for involve a long complicated process with many steps of varying difficulty that a developer is likely to forget and I thought the ideas from this book may help. Unfortunately the takeaways do not seem to carry over from medicine to software development.
Overall 6/10 – Maybe a more junior/beginning developer would find this useful but for an inexperienced dev it’s mostly common sense.

I bought this book for the wrong reason. I saw it, looked at the index and thought that the content was exactly what I would have wanted as a beginning software developer. Problem being I’m no longer a beginning software developer so too much of the content is no longer useful.
Some Takeaways I did like:
Quirky ideas I wouldn’t have considered but can’t discredit or find interesting include: