- Table of Contents (favorites in bold)
- C and C++ Prioritize Performance over Correctness August 2023
The meaning of “undefined behavior” has changed significantly since its introduction in the 1980s.
- Coroutines for Go July 2023
Why we need coroutines for Go, and what they might look like.
- Storing Data in Control Flow July 2023
Write programs, not simulations of programs.
- Opting In to Transparent Telemetry (Transparent Telemetry, Part 4) February 2023
Updating the transparent telemetry design to be opt-in.
- Use Cases for Transparent Telemetry (Transparent Telemetry, Part 3) February 2023
Many examples of ways that transparent telemetry would help developers understand their software better.
- The Design of Transparent Telemetry (Transparent Telemetry, Part 2) February 2023
Details about how transparent telemetry could work.
- Transparent Telemetry for Open-Source Projects (Transparent Telemetry, Part 1) February 2023
What would open-source-friendly telemetry look like?
- Transparent Telemetry February 2023
- The Magic of Sampling, and its Limitations February 2023
The magic of using small samples to learn about large data sets.
- Go’s Version Control History February 2022
A tour of Go’s four version control systems.
- What NPM Should Do Today To Stop A New Colors Attack Tomorrow January 2022
Stop blindly installing the latest version of all transitive dependencies.
- On “Trojan Source” Attacks November 2021
Code review is the answer to this and many other problems.
- How Many Go Developers Are There? July 2017, updated August 2021
Around two million.
- Updating the Go Memory Model (Memory Models, Part 3) July 2021
What changes should we make to Go's memory model?
- Programming Language Memory Models (Memory Models, Part 2) July 2021
An introduction to programming language memory models.
- Hardware Memory Models (Memory Models, Part 1) June 2021
An introduction to hardware memory models.
- Memory Models June 2021
- The Principles of Versioning in Go (Go & Versioning, Part 11) December 2019
The rationale behind the Go modules design.
- Go Proposal Process: Representation (Go Proposals, Part 6) October 2019
How do we increase user representation in the proposal process, and what does that mean?
- Go Proposal Process: Enabling Experiments (Go Proposals, Part 5) September 2019
How can we balance stability and experimentation?
- Go Proposal Process: Scaling Discussions (Go Proposals, Part 4) August 2019
How can we scale large discussions?
- Go Proposal Process: Large Changes (Go Proposals, Part 3) August 2019
How can we identify and handle large changes better?
- Go Proposal Process: Clarity & Transparency (Go Proposals, Part 2) August 2019
What would improve everyone’s understanding of the process?
- Thinking about the Go Proposal Process (Go Proposals, Part 1) August 2019
What works about the Go proposal process? What doesn’t?
- Go Proposals August 2019
- Transparent Logs for Skeptical Clients March 2019
How an untrusted server can publish a verifiably append-only log.
- An Encoded Tree Traversal February 2019
An unexpected tree traversal ordering.
- Our Software Dependency Problem January 2019
Download and run code from strangers on the internet. What could go wrong?
- Why Add Versions To Go? (Go & Versioning, Part 10) June 2018
Why should Go understand package versions at all?
- What is Software Engineering? (Go & Versioning, Part 9) May 2018
What is software engineering and what does Go mean by it?
- The vgo proposal is accepted. Now what? (Go & Versioning, Part 8) May 2018
What is the state of vgo?
- Versioned Go Commands (Go & Versioning, Part 7) February 2018
What does it mean to add versioning to the go command?
- Defining Go Modules (Go & Versioning, Part 6) February 2018
How to specify what's in a module.
- Reproducible, Verifiable, Verified Builds (Go & Versioning, Part 5) February 2018
Consistent builds in versioned Go.
- Minimal Version Selection (Go & Versioning, Part 4) February 2018
How do builds select which versions to use?
- Semantic Import Versioning (Go & Versioning, Part 3) February 2018
How do you deploy an incompatible change to an existing package?
- A Tour of Versioned Go (vgo) (Go & Versioning, Part 2) February 2018
We need to add package versioning to Go.
- Go += Package Versioning (Go & Versioning, Part 1) February 2018
We need to add package versioning to Go.
- Go & Versioning February 2018
- Glob Matching Can Be Simple And Fast Too April 2017
Regular expression exponentials in another form.
- My Go Resolutions for 2017 January 2017
What I would like to do for Go in 2017.
- Go and Dogma January 2017
Programming language dogmatics.
- Lock-Free Bugs January 2017
Locked frees and freed locks.
- Version SAT December 2016
Dependency hell is NP-complete
- Hacking the OS X Kernel for Fun and Profiles August 2013
Modifying the OS X kernel binary to make user-level CPU profiling work
- How To Build a User-Level CPU Profiler August 2013
The internals of Google's pprof CPU Profiler (for C++ and Go)
- A Tour of Acme September 2012
A video introduction to Acme, the Plan 9 text editor
- A Tour of Go June 2012
A video introduction to Go: interfaces, reflection, concurrency
- QArt Codes April 2012
How to make pictures with QR codes, part II
- Finite Field Arithmetic and Reed-Solomon Coding April 2012
How to make pictures with QR codes, part I
- Random Hash Functions April 2012
Go ahead, call rand in your hash function.
- go blog() February 2012
Sorry about the RSS trouble.
- Regular Expression Article #4 January 2012
Regular Expression Matching with a Trigram Index, or, How Google Code Search Worked
- Floating Point to Decimal Conversion is Easy July 2011
Straightforward printing of floating-point values.
- Minimal Boolean Formulas May 2011
Simplify equations with God
- Irregular expression matching with the .NET stack May 2011
Matching well-formed XML (!) with a not-quite-regular expression
- Knuth, Volume 4A January 2011
- The MOS 6502 and the Best Layout Guy in the World January 2011
When chip design meant drawing every wire by hand
- Visualizing TCP December 2010
Seeing the packets
- Yacc is Not Dead December 2010
Even if it smells that way.
- Webscript September 2010
A language I'm still waiting for
- Computing Machines April 2010
A real Turing machine!
- Broken abstractions in Go March 2010
Mind-bending implementation techniques
- Zip Files All The Way Down March 2010
Did you think it was turtles?
- Regular Expression Article #3 March 2010
Regular Expression Matching in the Wild
- Formal Logic Club March 2010
This one you can talk about.
- UTF-8: Bits, Bytes, and Benefits March 2010
The reasons to switch to UTF-8
- Off to the Races February 2010
How to break memory safety using race conditions
- Names February 2010
My variable naming philosophy
- Go's Package Name Space February 2010
Why you can name any package math
- Generating Good Syntax Errors January 2010
How to make yacc print good syntax errors
- Gofmt December 2009
The end of the style wars
- Regular Expression Article #2 December 2009
Regular Expression Matching: The Virtual Machine Approach
- Data Structures Go Programs December 2009
- The Generic Dilemma December 2009
Musings about generics in Go
- Go Data Structures: Interfaces December 2009
How interface values work in Go
- Go Data Structures November 2009
An introduction to basic Go data structures
- Is This Thing On? November 2009
Back to blogging...
- Electoral Programming June 2008
The dynamics of elections
- Lessons from the Debian/OpenSSL Fiasco May 2008
Looking at the context that made it possible
- Mel was Real April 2008
- Backups, heal thyself April 2008
Disk storage that can heal itself
- Bi-quinary and other bases April 2008
Like counting with one hand
- Computing History at Bell Labs April 2008
Doug McIlroy’s rememberances
- Bigger Programs are Better, not Best April 2008
The Busy Beaver Problem
- Alphabetical Order April 2008
Is sorting hard because it is recursive?
- Using Uninitialized Memory for Fun and Profit March 2008
An unusual but very useful data structure
- Rotating Hashes March 2008
A hashing technique that faded into history
- Leaping Years and Drawing Lines February 2008
... and why they're the same problem
- Face the Nation February 2008
- Permissive Access Links February 2008
The locks on nuclear weapons
- Elegance and Power February 2008
Elegant Haskell programs for computing power series
- Worms and Distributed Computations February 2008
A look at early distributed systems
- The Hideous Name February 2008
The pitfalls of mixing naming systems
- Bourne Shell Macros February 2008
How to make C look like ALGOL
- Traveling Passenger Problems February 2008
The computational complexity of airline travel
- Absolute File System Design February 2008
A file system that was truly robust against failures
- B Languages February 2008
Some influential languages of the past.
- Traffic Lights and Buridan's Ass February 2008
My favorite paper that was never published
- The Discovery of Debugging February 2008
Someone had to do it.
- Unix Viruses February 2008
Experience with some early computer viruses
- On Duff's Device and Coroutines January 2008
An abuse of C
- Play Tic-Tac-Toe with Knuth January 2008
The only winning move is not to play.
- Debugging the Universe January 2008
Physicists at work
- I Could Tell You, But ... January 2008
... well, let's leave it at that.
- Play Chess with God January 2008
The perfect chess machine
- Superoptimizer January 2008
When in doubt, use brute force.
- Division via Multiplication January 2008
A now-standard compiler optimization
- Scooping the Loop Snooper January 2008
The halting problem, in verse
- Crabs, the bitmap terror! January 2008
A destructive, pointless violation of the rules
- Bitblt January 2008
The canonical introduction
- Literate Programming with Lguest January 2008
The most readable VM you'll ever see.
- Killing Quicksort January 2008
How to force Quicksort to run in quadratic time
- Introduction January 2008