Hey folks! I’m Will Larson, sometimes known as Lethain, and this is my website. If you’re new to my writing, take a look at some of the popular stuff I’ve written, or check out the two books I’ve written: Staff Engineer and An Elegant Puzzle. If you’d like to hear from me a bit more frequently, sign up for my weekly newsletter or via the RSS feed.
Trunk and Branches Model for Scaling Infrastructure Organizations
Getting started with git-scraping
The impact of less scalable work.
Things I learned hiring a data science leader.
Dipping toes in angel investing.
Why not start an indie tech book publisher?
⭐ Inspection and the limits of trust.
Thesis on engineering onboarding products.
Should you write a technical or management book?
Notes on The Kool-Aid Factory's Planning Issue.
How to find engineering leadership roles.
⭐ How to safely think in systems.
Learning about personal finances.
Notes on hiring a Foundation Eng leader.
Closing calls: tell the best version of the truth.
Create capacity rather than capture it.
Getting to yes: solving engineering manager hiring loops that reject every candidate.
Pockets of rest enable careers.
Can senior leaders make friends at work?
Mailbag: Should we just call them architects?
RSS feed changing! Migrating blog in next few days.
Mailbag: How to deal with unhappy users on your Internal platform?
Measures of engineering impact.
Digital gardening at Exuberant Sketches.
Self-publishing Staff Engineer.
Mailbag: Building alignment around a new strategy.
Mailbag: How to encourage good documents rather than perfect documents?
The curious case of the missing regretted attrition.
Why not create a StaffEng Slack or Discord?
Early Edition of "Staff Engineer" coming Jan 31st.
Tech Lead Management roles are a trap.
Interesting work happens at the edges.
Weak and strong team concepts.
What do Staff engineers actually do?
Managing Staff-plus engineers.
⭐ Write five, then synthesize: good engineering strategy is boring.
Mailbag: Advice for someone five years into their tech career?
Interviewing for Staff-plus roles.
My skepticism towards current developer meta-productivity tools.
Renegotiating your first vendor contract.
Speaking and podcasts in 2020.
Engineering strategy every org should write.
Surplus rules of engineering strategy.
Care and feeding for your engineering strategy.
Things that aren't engineering strategy.
A survey of engineering strategies.
Developer productivity surveys.
⭐ Managing technical quality in a codebase.
Finding the right company to reach Staff Engineer.
Using QR Codes in printed books.
Some common hiring manager mistakes.
Customizing screen and screenrc.
Staff-plus interview processes.
Does the Staff title even matter?
Where do Staff-plus engineers fit into the org?
Stuff I've learned about Diversity, Equity and Inclusion over the past few years.
How to practice backend engineering.
Picking problems for programming interviews.
Testing Python projects for Google Cloud Run.
Staying aligned with authority.
How do folks reach Staff Engineer?
Hotspotting developer productivity.
vtt-compactor: slightly less verbose VTT files.
Resources for Staff-plus engineers.
From one to two: how to start a successful distributed engineering office.
Interviewing senior engineering leaders.
Mailbag: Evolving your engineer career beyond the career level.
Crowdsourcing CTO/VPE learning circles.
Do you work at a tech company?
How to partner with an executive assistant.
Example Call For Proposals submissions.
Some rough notes on running learning circles.
How to build your company's engineering brand.
⭐ Your first 90 days as CTO or VP Engineering.
How to navigate and/or survive your acquihire.
⭐ How the Digg team was acquihired.
"Good Process is Evolved, Not Designed" in 97 Things Every Engineering Manager Should Know
Incident response, programs and you(r startup).
Mailbag: When your team wants your job, personal brand, and service registries.
Maintaining platform-product fit.
"How to successfully design organizational processes"
"Do engineering managers need to be technical?" in Increment.
Expanding on S[a-z]{3,} Reliability Engineer roles.
Notes on Building Evolutionary Architectures.
You only learn when you reflect.
Distributing your Slack application.
Using Cloud Firestore to power a Slack app.
Make Slack app respond to reacji.
Adding App Home to Slack app in Python.
Creating a Slack App in Python on GCP.
HMAC SHA256 signatures in Python and Flask.
Forecasting synthetic metrics.
"Investing in technical infrastructure"
An Elegant Puzzle by the numbers, five months later.
Notes on data modeling from Handbook of Relational Database Design.
Rewriting the Yahoo! BOSS Datahub.
Distributed systems vocabulary.
⭐ Reclaim unreasonable software.
What's the inverse of literate programming.
Notes on Escaping the Build Trap
Programs: tips for owning the unownable.
Running systems library as Cloud Function.
Path to engineering manager of managers.
An Elegant Puzzle @ Software Engineering Daily
What I learned writing a book.
Privilege's upward-facing window.
Elegant Puzzle press, reviews and podcasts.
An Elegant Puzzle is released today!
Make timeline tradeoffs using iterative elimination tournaments.
⭐ How to invest in technical infrastructure.
Can governments design great APIs? Let's hope so.
An Elegant Puzzle is available for pre-order.
An Elegant Puzzle coming in late May.
Rules of thumb for org design.
⭐ How to evolve an engineering organization.
Paying the predictability tax.
Valuing already-solved problems.
⭐ Why limiting work-in-progress works.
Binder for hosting Jupyter notebooks.
Writing a reliability strategy: reason about complex things with system models.
Notes on Soul of a New Machine, Messy Middle, Crazy at Work, Company of One.
Growing with your company's complexity.
An Elegant Puzzle: Systems of Eng Management.
Newsletter for Irrational Exuberance.
⭐ Metrics for the unmeasurable.
Some delightful developer experiences in 2019.
Good process is evolved, not designed.
Defining policy, process and programs.
Notes on Structure and Interpretation of Computer Programs.
"Paying Technical Debt at Scale - Migrations"
⭐ Infrastructure planning: users, baselines and timeframes.
Notes on The Timeless Way of Building
Quick tutorial on using GraphQL with Python.
Speaking at QCon SF 2018 about migrations.
Quick blogging update for October 2018
Notes on The Pyramid Principle.
System dynamics in a jupyter notebook.
Work the policy, not the exceptions.
Modeling a hiring funnel with Systems library.
Introduction to systems thinking.
Notes on A Philosophy of Software Design.
Time management: the leadership meta-problem.
Problem exploration, selection and validation.
⭐ Introducing SREs, TPMs and other specialized roles.
Career levels, designation momentum, etc.
Designations, levels and calibrations.
Make your peers your first team.
Digg v4 @ Internet History Podcast
Writing strategies and visions.
Braindump on approach to writing a technical book.
Guiding broad change with metrics.
⭐ Digg's v4 launch: an optimism born of necessity.
My rails for engineering leadership.
Accelerate's definition of developer productivity.
The briefest of media trainings.
A case against top-down global optimization.
Infrastructure migrations @ Interestings
Staying on the path to high performing teams.
Where to stash your organizational risk?
Experiment with distributed finite state machines.
You can't reason about big balls of mud.
Consider the team you have for senior positions.
Setting organizational direction.
⭐ Migrations: the sole scalable fix to tech debt.
Reflections on the Systems & Papers.
The Redis Protocol is pretty great.
⭐ Some of my favorite technical papers.
Managing in the growth plates.
Infrastructure engineering @ Inside Intercom
Notes from "Good Strategy, Bad Strategy."
How I write group emails at work.
Refactoring Ruby programmatically.
⭐ Product management in infrastructure eng.
Experimenting with content and distribution.
⭐ Inclusion in the first shift.
⭐ The physics of Cloud expansion.
Async processing with sync semantics?
⭐ Cold sourcing: hire someone you don't know.
Roles over rocket ships, and why hypergrowth is a weak predictor of personal growth.
⭐ Engineering management stuff I learned in 2017.
Analyzing cross-service requests with Apache Beam.
⭐ From lambda to kappa and dataflow paradigms.
Tools for operating a growing organization.
Sketching out failure injection on Kubernetes.
Simple Continuous Deployment on GKE with gke_ci
Trying out Google Container Engine
Providing pierceable abstractions.
Options for orchestrating periodic tasks.
Infrastructure between cost center and ego trip
Ways Engineering Managers Get Stuck
Serverless: Gatekeeping and Profit Margins
⭐ Productivity in the age of hypergrowth.
Acing Your Architecture Interview
Running a Humane Interview Process
Wherein I Rewrite My Blog a Fifth Time
Adding Value as an Engineering Manager
⭐ Developing service oriented architectures.
Building a Software Deployment Pipeline
Irrational Exuberance's Fourth Coming
Company Culture and Managing Freedoms
Kill Your Heroes, Stop Doing it Harder
Extraction: Get Metadata from HTML Documents
Social Hierarchies in Engineering Organizations
Creating Multi-Worksheet Excel Docs with xlwt
Why Pagination Was Hard at Digg
Slack and Hope for Middle Management
Digg v4's Architecture and Development Processes
Writing, Analytics and Analysis
Storing Bounded Timeboxes in Redis
Using Flot.js with the Digg Streaming API
⭐ Introduction to architecting systems for scale.
How to Filter Bots From Analytics
Don't Make Me Defend Your Claims
IE's New Infrastructure and Writing Workflow
Irrational Exuberance's Third Rebirth
Python Default Parameter Value Gotchas
Python Datastructures Backed by Redis
SuperFamily Relationships with Lazyboy
Callbacks Are An Informal Pipeline
Porting Django's urlpatterns to Node.js
Retiring and Releasing Codernote.com
Log Collection Server with Node.js
Debugging Crashes With Small Scripts
A Python-Markdown Extension for Embedding Graphviz
Formatting Multipart Formdata in Erlang
A Photo Album with Python and PIL
Refactoring & Testing Our Dynamo Clone
Crash on Compiling App With MKMapView
Replicating receive-after in an Erlang gen_server
Durable Writes & Consistent Reads
Hands On Review of the Dynamo Paper
Recurring Events and Message Passing
A Couple of Clojure Agent Examples
Comments on "Why Engineers Should Consider Formal Methods"
Money or Meaning: Spending Our Wealth of Time
A Failed Stack-based Markdown Interpreter
Proposal for Authenticating Web Callbacks
Generating RSS feeds via BeepBeep
How Pitance Versions Documents in CouchDB
Erlang Brush for SyntaxHighlighter
Pitance: Template and Snippet Infrastructure
Load Balancing Across Erlang Process Groups
Changing Mimetypes for Text Responses in BeepBeep
Paper Review of "Hints On Computer System Design"
Paper Review of "A Transaction Model"
Several Approaches to Versioning Files in PHP
Distinguishing Strings from Lists in Erlang
Freebase Hackday and Image Game
BeepBeep, CouchDB and a Trivial Blog
Using Ajax with the BeepBeep Microframework
What Do Django People Search About?
YUI Dialogs, IE z-index and Tragedy
Feedback Loops in Software Development
Recycling Hacker Fear-Mongering
Skew, The Frontend Engineer's Misery
OS X Textfield Encoding (maybe) Issue
Findjango Redesign & Slides for django-nyc
How To Remotely Admin Servers Via Twitter
Making Django Apps Run On and Off GAE
Technical Debt and Peanut Butter Jars
Findjango: A Django Search Vertical
Solango and Tomcat 6 on Ubuntu Intrepid
Simplified django-springsteen Deploy on GAE
Deploying django-springsteen on Google App Engine
Reranking Results in django-springsteen
django-springsteen and Distributed Search
Smaller Header, JobSyndicate, Printable Articles
Measuring Single and Multi Server Performance
Rewriting Parameterized URLs with Nginx
Overview of Single vs. Multi Server Architecture
The Django and Ubuntu Intrepid Almanac
Visually Representing Word Structures
Setting up CouchDB-Lucene on OS X
We're All Sinners and Cosiners
Visualizing Keyterms with BOSS and Processing
Cull Lingering Erlang Heart Processes
Hard and Soft, Fluffy and Brittle
Stripping Illegal Characters from XML in Python
Huge CSV and XML Files in Python
A Filter to Display Neighbors in a List
Genetic Programming: A Novel Failure
⭐ Genetic algorithms: cool name & damn simple.
Django-Portfolio: Organize and Display Projects
The Subtle Joys of Generic Methods
A Command Line Tool for Loading CouchDB Documents
Full-Text Search in CouchDB Using... CouchDB
Intro to HTTP::Server::Simple::CGI
Finally Waving The White Flag to Objective-C 2.0
Prevent Cron Cancer With a File-based Mutex
Parallel HTTP Requests in Python
Reading XML Files on the iPhone
A Different Approach to local_settings.py
XML::Twig for Large XML Files in Perl
Slides from django-nyc on 11/18/2008
Python-Brightkite for... you get the idea
Introducing a Tutorial and touchDefense
The Fate of Pop and Hip-Hop in 2008
Bad Ideas and Regular Expressions in Templates
Development to Deployment in Django
Creating Slideshows with Cocos2d iPhone
Customize site style by user with django-userskins
User Registration Apps for Django
Releasing Kappa Source (PyObjC Twitter Client)
Advice to Programmers in College
Touch Detection in Cocos2d iPhone
HSS and YUI Compressor in AYM CMS
R.I.P. Your Resume Site to Awesome
Taming AuditTrail Proliferation
Choosing Between AuditTrail and Django-Rcsfield
Restricting User Signups in Django
The Magical Source of YUI Get's Power
Notes on Cocos2d iPhone Development
Suffer Less By Using Django Dev Server as a Proxy
Starting Again, Keeping It Simple
As-You-Type Slug Uniqueness Validation
Custom Django Views for Happier Ajax
Using Automator to Scale Images Horizontally
Intro to Unintrusive JavaScript with Django
Making Static Dynamic Again; AYM CMS
Intricate Static Websites With Django Templates
Yes, You Do Care About Cappuccino
Extending Mahou; Gotchas and Snippets
Extracting Data From Google Analytics Reports
Extending Classes in Cappuccino
Writing Mahou; a Cappuccino Image Search
Migrating the 'This Week in Django' Concept
Poor Wireless Connectivity for MacBook
Naming and Casing Convention in PyObjC
Introducing Kappa, a Twitter Client
Dynamic Ad Targeting With django-monetize
Transcending Search-as-You-Type Stickiness
Epic PyObjC, Part 5: Resources and Farewell
Epic PyObjc, Part 4: Drag & Drop, Multiple Nibs
Epic PyObjC, Part 3: Browsing, Caching, Indicating
Epic PyObjC, Part 2: Adding a Library & Bindings
⭐ An Epic Introduction to PyObjC and Cocoa
Writing to Application Support in PyObjC
Writing Titles Under Ninety-Five Characters
Deleting From NSOutlineView With the Delete Key
How to Use Selectors in PyObjC
An Introduction to Using CouchDB with Django
Global Popularity of Programming Languages
An Introduction to Compassionate Screen Scraping
A Syntax Coloring Template Filter for Django
Python Content Scraper for OneManga.com
Reading "The Nudist on the Late Shift" in 2008
Cocoa Drag and Drop text into the Dock Icon
How to Write a Wrapper Library
BossArray for list-like Yahoo search results
Replacing Django's ORM with SQLAlchemy
Replacing Django's Template Language With Jinja2
An Introduction to Django's Loose Coupling
Reflections on a Year of Blogging and Japan
Last Day of Elementary School and Classes
Stripping Reddit From HackerNews With BOSS Mashup
Polishing Up Our Django & BOSS Search Service
Search Recipes for Yahoo's BOSS in Python
Yahoo's Build your Own Search Service in Django
Advice for ALTs Considering a Second Year
An Introduction to a Week in Japan
ReST, Textile and HTML in Markdown
Sparklines in Javascript With Sparklines.js
JSON, Object Oriented Views, and Starting a Real App
Ambush Code Review Learns Code Diffs
Overview of Using Django on the Google App Engine
A Sunday Project: Ambush Code Review
A Django Anti-Pattern, Rolling Your Own REST
Working on LifeFlow's Public Face
Release of LifeFlow Version 0.90
Deployment Scripts With BeautifulSoup
Strangest JavaScript Bug I've Ever Seen
Looking for Recycling's Lost Sex Appeal
Updates to Processed Tower Defense
Spoken Languages, Blub, and Convenience
Music From the iTunes Store, 1
Improvements to LifeFlow Editor
Updating Processing.js Graphics via Ajax
Design of Processed Tower Defense
Using Javascript to Control Processing
Getting Started with Processing.js
Failed Night Time Pictures of Sakura Blossoms
Opening Files With Associated App in Cocoa
Tip Your Hat To Accessors And Mutators
Quick Reflections on JET in Haiku
Assigning One To Many Relationships in CoreData
Spring Doesn't Come in February, But Snow Does
Filtering Arrays in Objective C
Teaching Elementary Classes as an ALT
Midnight Philosophy in The Garden of Good and Evil
Seeking Some Music I Can't Find
Some Biased Analysis of Music Videos
Using Optional Parameters in Django Urls
Technical Aspects of the Life Flow Editor
Introducting the LifeFlow Editor
On Hegemony and an Anti-Capitalist Bias in European Textbooks
5. A Chartered Bus to Downtown Tokyo
Standard Workflow for Publishing With LifeFlow
Replacing the Karma Social Model with Whuffie
Translating Entries into Other Languages with LifeFlow
A Historical Perspective on the JET Program in 2008
On The Causes and Cures of Malware
Failures of Proactive Communication & Other Generic Complaints
Opinionated Programming Languages, The Huddled Masses, and Elitism
Lesson Plan: My Winter Vacation
New Style for Including Resources in Entries on LifeFlow
Adding Arbitrary Mods to LifeFlow
Introduction to Kamioka-cho, Hida-shi, Gifu-ken, Japan
Odors from Shoes Curious in OS X 10.4
Don't Repeat Yourself for Bloggers: Dynamic Blog Context in LifeFlow
Cleanly Extending Python Markdown with Syntax Highlighting
Customizing LifeFlow Quickly with Skins
Installing a Development Deployment of LifeFlow, a Django Blog Solution
Reflections on the old year, and the new one
BluePrint CSS makes LifeFlow look better, and easier to customize
Music Recommendations & Snow Pictures
Implementing Threaded Comments in LifeFlow
Packaging of Renu Contact Solution
Moving Writings to Separate Flow
Two-Faced Django Part 7: PyFacebook and FBJS Ajax
Upgrading from 256 to 512 megs of ram
Two-Faced Django: Live install
Two-Faced-Django Part 6: PyFacebook
Two-Faced Django Part 5: JQuery Ajax
Two-Faced Django Part 4: The Webapp
Two-Faced Django Part 3: Newforms
Two-Faced Django Part 2: Models and Django Testing
Two-Faced Django Part 1: Building a project that exists simultaniously on Facebook and the web
On Education, Self-Responsibility and Manure
Using JQuery with Django for Autocomplete Fields
Using PyFacebook without the Facebook middleware
"You Are Beautiful At All Times" by Yppah
Context is a Parameter in Calculating Truth
Introducing my Japanese Kitchen
Teaching Adult English Classes
Getting started with Shoes on OS X
Expectations and Reality for the lowly ALT
Leaving Tokyo, Arriving in Kamioka
From America into an American Bubble: The Flight to Japan
Failure of Implicit Conventions: Determining Function Destructiveness
"Building Scalable Web Sites" by Cal Henderson
Dreamier Dream Server with Nginx
Adding Social Bookmarking To a Django App
Syntax Highlighting with MarkDown, and a pinch of Automagick for Django
Music Video? Movie? The 'Once' Dilemma
Extracting Models From Django Datadump
Creating my Dream Server for Django
New Look for LifeFlow, Deployment on Dreamhost
"Puddle City Racing Lights" by Windmill
How to Migrate Data Across Model Changes
Writing Custom Contexts for Django
Examining Web Analytics to Implement (repost)
A Django Middleware for Google Analytics (repost)
Anti-Objects and Reflexive Decisions (repost)
A Comp. Sci Degree is What You Make Of It (repost)
Is the JVM the "next assembly"? I hope not. (repost)
Good to Great, Paul Graham and Ayn Rand (repost)