Common pitfalls in Go benchmarking

Go programmers have the good fortune of excellent testing and benchmarking tooling built into the standard library - in the testing package. However, benchmarking is hard. This isn't Go specific; it's just one of those things experienced developers learn over time. This post list...

Preview: ranging over functions in Go

A major Go language change proposal was published earlier this week: add range over int, range over func, and there's a good chance this change will make it into a future Go release. In this post I will discuss the motivation for this proposal, how it's going to work, and …

o11y Done Wrong — Lessons Learned from Monitoring Production Systems

Getting Friendly With CPU Caches

Introduction When a CPU needs to access a piece of data, the data needs to travel into the processor from main memory. The architecture looks something like this: Figure 1: CPU Cache Figure 1 shows the different layers of memory a piece of data has to travel to be accessible by t...

Wishlist Endpoint Discovery

Learn how to use the recently-added Tailscale, DNS, and Zeroconf endpoint discovery in Wishlist, our SSH host directory.

Ten Years of “Go: The Good, the Bad, and the Meh”

Ten years ago, I wrote Go: The Good, the Bad, and the Meh. Way back in 2013, it made it to the front page of Hacker News and got over 400 comments on /r/programming. I don’t have analytics from back then, but I suspect it’s one of my more discussed pieces of writing,...

Coroutines for Go

Why we need coroutines for Go, and what they might look like.

Govulncheck v1.0.0 is released!

Version v1.0.0 of golang.org/x/vuln has been released, introducing a new API and other improvements.

Storing Data in Control Flow

Write programs, not simulations of programs.

Polymorphism and other important aspects of inheritance