Sometimes, I read an article, and some idea deeply resonates with me and makes a long lasting impression. It changes the way I approach some topic.
Fred Brooks’ essay “no silver bullet” was one of the very first article I read that had this effect. The concepts of esssential and accidental complexity are very powerfull, deeply resonate with me, and shaped the way I see software engineering. This essay is a classic because it had the same effect on many people.
But there are other many great articles that influenced me. Let’s recap some of them:
No silver bullet, Fred Brooks
A software system consists of essential and accidental (or implementation) complexity. We should reduce accidental complexity as much as possible, but essential complexity will still be the dominng factor.
The law of leaky abstractions, Joel spolsky
It’s very hard to devise abstractions that completely hide the underlying complexity. Often, you will need to understand some internal details no matter what.
Simple Made Easy, Rich Hickey
This is a great talk about complexity. The key takeaway is that simplicity comes from not mixing things together that shouldn’t. It’s independent of your prior knowledge. Easiness comes from habits and convention. It depends on prior knowledge.
Choose Boring Technology, Dan McKinley
A reminder that using shiny new tools isn’t always the best option and that established and mature tools has its place if they suffice to get the job done.
There is no now, Justing Sheehy
An exploration of the way to handle time in distributed systems, where there’s no global notion of time or consistency.
Beating the Average, Paul Graham
A classic from Paul Graham where he described how using Lisp and macros gave the company an advantage over their competitors.
Life Beyond Distributed Transaction, Pat Helland
An articles about giving up distributed transactions to design internet-scale systems using simpler data models (e.g. key-value stores)
Everything You Know About Latency Is Wrong, Tyler Treat
In short: using average or percentile hides your outliers, which is an important signal to understand the real beahvior of the system.
A Note on Distributed Computing, S. Kendall et al.
An article explaining that trying to abstract remote boundaries is bound to fail.
Smalltalk: A Reflective Language, F. Rivard
A very nice explanation of Smalltalk and its reflective capabilities showing how to adapt the language to add pre/post conditions. The reification of the stack and the fact that the debugger is just a normal tool is also explained.
Reuse: is the dream dead?, Kirk Knoernschild
An exploration of the use/reuse paradox: “Maximizing reuse complicates use”
Reflection on Trusting Trust, Ken Thompson
A wicked experiment on bootstraping
The Log: What Every Software Engineer Should Know About Real-time Data’s Unifying Abstraction, Jay Kreps
A fanstatic analysis of the distributed log as the basic building block to integrate real-time systems. So good, that it was later converted in a book: I love logs.
Most of these authors have written several other articles that are great as well.