All blogs / DevOps / SRE / infrastructure
Surfing Complexity
Lorin Hochstein's ramblings about software, complex systems, and incidents.
DevOps / SRE / infrastructureDistributed systems / cloudSoftware / engineering practice
- Posts
- 405 from 12 Dec 2011 to 19 Oct 2026
- Posting
- weekly (57 in the last year)
- Kind
- personal blog
- Feed
- https://surfingcomplexity.blog/feed/
2026 45
- Anthropic and the changing nature of work
- Quick thoughts on GitHub’s Sept 23 incident
- There was a light that never went out
- Saturation at GitHub: the saga continues
- How the incident happened: a play in one act
- Thoughts on the July 8th Telstra outage report
- Thoughts on the Buildkite Aug 25 incident
- Quick thoughts on GitHub Actions Aug 26 incident
- Omnipresent availability risks in cloud software
- Wild AI-related reliability incidents are coming
- GitHub, autoscaling, and the component substitution fallacy
- Tough days at GitHub, a continuing series
- Quick thoughts on Azure Regional Outage from July 23, ’26
- GitHub has another tough day
- Traditional versus resilience engineering views
- My talk from the Software Should Work conference
- Synthesis is harder than analysis
- I am dreading our LLM-written incident report future
- Dear researchers column
- I can’t bear to read AI-generated prose
- The demon of the gaps
- Form may follow function, but use doesn’t follow design
- The coming coordination calamity
- Reliability as a game of improving the odds
- Flipping the bozo bit on flips the learning off
- How incidents can teach us about what’s already working well
- My SREcon talk
- Life comes at you fast
- The normal work of creating reliability
- Thoughts on the Bluesky public incident write-up
- References from my SREcon talk on stories
- Quick thoughts on GitHub CTO’s post on availability
- Grow fast and overload things
- Saturation
- Quick takes on Feb 20 Cloudflare outage
- Poor Deming never stood a chance
- Lots of AI SRE, no AI incident management
- Nobody knows how the whole system works
- On variability
- Ashby taught us we have to fight fire with fire
- Because coordination is expensive
- Amdahl, Gustafson, coding agents, and you
- From Rasmussen to Moylan
- Telling the wrong story
- Verizon outage report predictions
2025 50
- On intuition and anxiety
- The dangers of SSL certificates
- Saturation: Waymo edition
- Another way to rate incidents
- Quick takes on the Triple Zero Outage at Optus – the Schott Review
- Why I don’t like “Correction of Error”
- AWS re:Invent talk on their Oct ’25 incident
- Quick takes on the Dec 5 Cloudflare outage
- Incidents: the exceptional as routine
- Fun with incident data and statistical process control
- Brief thoughts on the recent Cloudflare outage
- You’ll never see attrition referenced in an RCA
- Quick thoughts on the recent AWS outage
- This is fine!
- Caveat promptor
- The illegible nature of software development talent
- Two thought experiments
- A statistic is as a statistic does
- Fixation: the ever-present risk during incident handling
- The hidden trade-offs of fine-grained progressive rollouts
- Nothing fails like a history of success
- My favorite developer productivity research method that nobody uses
- The problems that accountability can’t fix
- Easy will always trump simple
- The trap of tech that’s great in the small but not in the large
- Formal specs as sets of behaviors
- Cloudflare and the infinite sadness of migrations
- Re-reading Technopoly
- Component defects: RCA vs RE
- “What went well” is more than just a pat on the back
- Quick takes on the GCP public incident write-up
- AI at Amazon: a case study of brittleness
- Pattern machines that we don’t understand
- Dijkstra never took a biology course
- The same incident never happens twice, but the patterns recur over and over
- LLMs are weird, man
- Not causal chains, but interactions and adaptations
- Labeling a root cause is predicting the future, poorly
- On work processes and outcomes
- When a bad analysis is worse than none at all
- You can’t prevent your last outage, no matter how hard you try
- Good models protect us from bad models
- Tradeoff costs in communication
- Model error
- Models, models every where, so let’s have a think
- Paxos made visual in FizzBee
- Locks, leases, fencing tokens, FizzBee!
- Resilience: some key ingredients
- You’re missing your near misses
- The danger of overreaction
2024 46
- Whither dashboard design?
- The Canva outage: another tale of saturation and resilience
- Quick takes on the recent OpenAI public incident write-up
- Your lying virtual eyes
- MTTR: When sample means and power laws combine, trouble follows
- Quick takes on the latest Cloudflare public incident write-up
- The Tortoise and the Hare in Alloy
- TTR: the out-of-control metric
- Reading the Generalized Isolation Level Definitions paper with Alloy
- Extending MVCC to be serializable, in TLA+
- Multi-version concurrency control in TLA+
- The carefulness knob
- Specifying serializability in TLA+
- If you don’t examine what worked, how will you know what works?
- A liveness example in TLA+
- Futexes in TLA+
- Why I don’t like discussing action items during incident reviews
- Linearizability! Refinement! Prophecy!
- Safety first!
- You can specify even when you can’t implement
- The “CrowdStrike” approach to reliability work
- CrowdStrike: how did we get here?
- Modeling a CLH lock in TLA+
- Reproducing a Java 21 virtual threads deadlock scenario with TLA+
- Incidents as keys to a lot of value
- Second-class interactions are a first-class risk
- Expect it most when you expect it least
- A still, small sound
- Book review: How Life Works
- Quick takes on Rogers Network outage executive summary
- Dirty writes
- Efficiency and bad outcomes
- Modeling B-trees in TLA+
- Action item template
- You can’t judge risk in hindsight
- The problem with a root cause is that it explains too much
- The error term isn’t Pareto distributed
- Green is the color of complacency
- The perils of outcome-based analysis
- The problem with invariants is that they change over time
- When there’s no gemba to go to
- What if everybody did everything right?
- Book Review: Trust in Numbers
- Negotiability is non-negotiable
- You should’ve known how to build a non-causal system
- Consistency
2023 32
- The inherent weirdness of system behavior
- Tell me about a time…
- On chains and complex systems
- The courage to imagine other failures
- Any change can break us, but we can’t treat every change the same
- “Human error” means they don’t understand how the system worked
- For want of a dollar
- Accidents manage you
- The surprising power of a technical document written by experts
- On productivity metrics and management consultants
- Operating effectively in high surprise mode
- Normal incidents
- Why LFI is a tough sell
- Oddly influenced podcast
- Active knowledge
- Resilience requires helping each other out
- If you can’t tell a story about it, it isn’t real
- When there’s no plan for this scenario, you’ve got to improvise
- Treating uncertainty as a first-class concern
- My SREcon 23 talk is up
- Missing the forest for the trees: the component substitution fallacy
- Some thoughts on my presentation style
- Making peace with the imperfect nature of mental models
- You can’t see what you don’t have a frame of reference for
- My talk from the LFI conference
- Good category, bad category (or: tag, don’t bucket)
- The value of social science research
- The high cost of low ambiguity
- Why you can’t buy an observability solution off the shelf
- Does any of this sound familiar?
- A small mistake does not a complex systems failure make
- The Allspaw-Collins effect
2022 32
- Southwest airlines: a case study in brittleness
- Knowledge and Power: A Sociotechnical Systems Discussion on the Future of SRE
- Incident categories I’d like to see
- CasesConf experience report
- Cache invalidation really is one of the hardest problems in computer science
- Writing docs well: why should a software engineer care?
- Time keeps on slippin’: A review of “Four thousand weeks”
- The down side of writing things down
- There is no “Three Mile Island” event coming for software
- Up and down the abstraction hierarchy
- Production pressure
- Uvalde: a reasonable officer
- Uvalde: would you have taken the shot?
- Common ground breakdown in Uvalde
- The fog of war in Uvalde
- What’s allowed to count as a cause: ALERRT edition
- Uvalde
- Incident response is a team sport
- You’re just going to sit there???
- Imagine there’s no human error…
- She Blinded Me With Science: A review of Galileo’s Middle Finger
- Bad Religion: A review of Work Pray Code
- We value possession of experience, but not its acquisition
- Software engineering in-the-large: the coordination challenge
- OR, DevOps, and LFI
- Prussia meets Versailles: a review of Moral Mazes
- Making operational work more visible
- Code rewrites and joint cognitive systems
- Taking the hit
- Bitrot
- Aristotle’s revenge
- Henry Yin on what the cyberneticists got wrong
2021 46
- The ambiguity of real work
- The Howie Guide: How to get started with incident investigations
- I have no idea what I’m doing
- How much did that outage cost?
- “What could we have done differently?”
- OOPS writeups
- The danger of hidden functional roles
- Plus c’est la même chose, plus ça change
- Adapting to a crunch: the Mask Match story
- The strange beauty of strange loop failure modes
- Live-drawing my slides during a talk
- Useful knowledge and improvisation
- Inconceivable
- Software Misadventures Podcast
- Contempt for the glue people
- Remembering the important bits when you need them
- The power of framing a problem
- The local nature of culture
- What do you work on, anyway?
- Modernists trapped in a post-modern universe
- Root cause of failure, root cause of success
- Burned by ‘let it burn’
- StaffEng podcast
- What’s allowed to count as a cause?
- The greedy exec trap
- Trouble during startup
- Controlling a process we don’t understand
- Designing like a joint cognitive system
- You have to go there
- Incident writeup as sociological storytelling
- Grappling with contingency
- The disaster meeting
- Transgressing the boundaries: Rasmussen and Woods
- Dealing with new kinds of trouble
- Objectives and constraints
- Why do config changes keep coming up in major incidents?
- Subverting the process
- Naming names in incident writeups
- Incident analysis as guerrilla case study research
- The British General’s problem
- Dog smartness
- Putting on a different hat
- Some quick thoughts on Citi’s $900M OOPSie
- Slack’s Jan 2021 outage: a tale of saturation
- Error budgets and the legacy of Herbert Heinrich
- Making sense of what happened is hard
2020 41
- Conscription devices, boundary objects, and GDocs
- Coding as a tool of thought
- Uber’s adventures in the adaptive universe
- Software as a limited medium
- Top-down code reviews
- Why you should write up your own incident
- Taming complexity: from contract to compact
- Even the U.S. military
- Battleshorts, exaptations, and the limits of STAMP
- Programming means never getting to say “it depends”
- Abstractions and implicit preconditions
- A nudge in the right direction
- Thoughts on STAMP
- Soak time
- In praise of the Wild West engineer
- Safe by design?
- All we can do is find problems
- The power of functionalism
- “How could they be so stupid?”
- A reasonable system
- Who’s afraid of serializability?
- SRE, CSE, and the safety boundary
- This mess we’re in
- Why you can’t just ask “why”
- Asking the right “why” questions
- Making peace with “root cause” during anomaly response
- The hard parts about making it look easy
- On the writing styles of some resilience engineering researchers
- Chasing down the blipperdoodles
- The inevitable double bind
- Embracing the beautiful mess
- How did software get so reliable without proof?
- Rebrand: Surfing Complexity
- Rehabilitating “you can’t manage what you can’t measure”
- An old lesson about a fish
- Have you seen this before?
- There is no escape from the adaptive universe
- There is no escape from Ashby’s Law
- The downsides of expertise
- Getting into people’s heads: how and why to fake it
- Conveying confusion without confusing the reader
2019 20
- Learning From Incidents in Software site
- Climbing the mountain
- Taking a risk versus running a risk
- Stories as a vehicle for learning from the experience of others
- The Gamma Knife model of incidents
- In service of the narrative
- The problem with counterfactuals
- Experts aren’t good at building shared understanding
- Tuning to the future
- Contributors, mitigators & risks: Cloudflare 2019-07-02 outage
- Contributors, mitigators & risks: Stripe 2019-07-10 outage
- What Deming got wrong
- Why incidents can’t be monocausal
- Elegance: UI vs implementation
- Postmodern engineering
- The seductiveness of single-metric decisions
- Root cause: line in Shakespearean play
- The danger of “insufficient virtue”
- Notes on David Woods’s Resilience Engineering short course
- Our brittle serverless future
2018 4
2017 10
- The Tortoise and the Hare in TLA+
- Death of a pledge as systems failure
- Antics, Drift and Chaos
- Assumption of rationality
- A conjecture on why reliable systems fail
- Engineering research reveals wrongdoing
- Sketching on the back end
- I’d rather read code than tests
- How open source beat agile
- Changing a complex system is hard
2016 3
2015 5
2014 18
- Ansible: Up and Running
- Paper review: Simple Testing Can Prevent Most Critical Failures
- Cloud software, fragility and Air France 447
- Estimating confidence intervals, part 6
- Good to great
- Estimating confidence intervals, part 5
- Estimating confidence intervals, part 4
- Not apprenticeship!
- Estimating confidence intervals, part 3
- Crossing the river with TLA+
- Estimating confidence intervals, part 2
- Presentation as text
- “Who owns the fish” in Alloy
- Results from estimating confidence intervals
- Happier developers are more productive
- Reading academic papers on a Kindle Paperwhite
- Tackling Hofstadter’s Law with confidence intervals
- People don’t understand computer science
2013 14
- Adopt an op
- Up and running on Rackspace
- Automated DevStack install inside of VirtualBox with Vagrant
- developerWorks article
- Head banging odds ratio
- The challenge of the network
- Books I wish existed
- Software Analysis
- No Country for IT
- Operator fault tolerance
- Payroll systems, not yet a solved problem
- Open-source documentation in the wild
- ESEM 2013 Industry Track CFP
- This really should be easier
2012 29
- Tech blog
- The good ones tell you when they’re wrong
- Line by line
- Publications trump ideology
- Training is a dirty word
- Ansible, Vagrant and OpenStack
- Relative confidence in scientific theories
- You never really know where you’ll end up
- “Don’t go into science”
- Black-hat SEO comes to the academy
- A point of view is not a bad thing
- When something you believe is false
- The software engineering grand challenge problem researchers ignore
- Apparently, I introduced a phenomenon
- Statistician, measure thyself!
- Empirical Software Engineering Stack Exchange Proposal
- There is no toggle lock signal
- How do you capture that?
- Unit testing: because all of the cool kids are doing it
- Predicting individual performance is hard
- Lacking a frame of reference
- Sitting has become synonymous with sloth
- I predict controversy
- Redacting results in reviews
- So, what happens if the programmer makes an error?
- Well-deserved
- Data proposal needs some love
- Tumbling
- Transition