tech, developers, and the code underneath

issue 202· news·

Go 1.27 and the six-month metronome

Go ships every February and August, has done for a decade, and the predictability is worth more than any feature in it.

Go's release cadence is one of the most boring facts in software: a version in February, a version in August, every year since 2015. Today is one of those days.

The predictability is not incidental to Go's success. It is a substantial part of it, and it is worth examining because most projects get this wrong in the other direction.

what a fixed cadence buys#

Planning that does not require guessing. A team can put "upgrade Go" in the calendar twice a year, permanently, and never think about it again. Compare with a project that ships when it is ready: every upgrade is an unscheduled interruption someone has to notice and argue for.

Features that are not held hostage. When the train leaves on a fixed date, an unfinished feature waits for the next one instead of delaying the release. That means no pressure to ship something half-done to make a date, and no feature holding the whole release. Rust's six-week cycle works the same way, and both languages are visibly healthier for it.

A support window you can reason about. Go supports the two most recent releases. That is a rolling twelve months, always, with no announcement needed.

the compatibility promise underneath#

None of the cadence would matter without Go 1's compatibility guarantee: code written against Go 1 continues to compile and run. That has held since 2012.

The combination is what makes Go upgrades routine rather than projects. You are not choosing between "stay on an old version" and "spend a sprint migrating" — the upgrade is a version bump in one file, a test run, and a deploy.

Very few ecosystems can say that. It is the single most underrated thing about the language and it almost never appears in comparisons, because absence of pain is hard to notice.

what to actually do on release day#

Nothing dramatic, which is the point.

  1. Read the release notes, specifically the "minor changes to the library" section. That is where behaviour shifts that are technically compatible and practically surprising tend to live.
  2. Bump the toolchain line in go.mod and run your tests.
  3. Check the vet and linter output. New releases usually teach go vet new checks, and those checks find real bugs in code that has been running for years.
  4. Look at the GC and runtime notes if you run anything latency-sensitive. Runtime changes are where the performance surprises are, in both directions.
  5. Do not skip versions. Two at a time is fine. Four is where people start having a bad week.

the general lesson#

If you maintain anything with users — a library, an internal platform, a service other teams build on — the cadence question is worth asking directly: do people know when the next version arrives, and can they plan around it?

"When it's ready" is the honest answer for a side project and a liability for anything load-bearing. A published date, even a slow one, lets everyone downstream stop guessing.

Boring, on a schedule, is a feature.

Dom, August 6, 2026

get README in your inbox

One dispatch, no noise. Tech and developer news, plus the occasional long piece on the craft.

subscribe →