Lies We Tell Ourselves to Keep Using Golang

https://fasterthanli.me/articles/lies-we-tell-ourselves-to-keep-using-golang
Long-form technical critique and rebuttal essay · Researched March 25, 2026

Summary

Amos Wenger, an experienced software engineer and language designer, addresses the persistent defensive arguments made by Go supporters whenever his 2020 "I want off Mr Golang's Wild Ride" critique resurfaces on tech discussion forums like HackerNews, Reddit, and Lobsters. The article systematically deconstructs what Wenger calls the "nine lies we tell ourselves" to justify continued Go adoption, acknowledging legitimate strengths of the language while arguing that its fundamental design flaws create compounding problems that become unbearable at scale.

Wenger concedes that Go possesses genuine merits: an exceptional async runtime with opinionated defaults, a state-of-the-art garbage collector, tooling that would make C developers envious, and "batteries included" libraries that simplify common tasks. He acknowledges these strengths attracted him and many others to the language initially. However, he contends that Go's philosophical choices—particularly the deliberate rejection of features like sum types, immutable data structures, and proper error handling—reflect an ideology of "anything goes" that merely pushes complexity onto other developers, operations teams, and end-users.

A critical argument centers on Go's isolation from the broader ecosystem. As "Plan 9 cinematic universe" software, Go uses custom assembly, linkers, debuggers, and calling conventions, making integration with other languages extraordinarily painful except across network boundaries. The author details how Go's designer decisions around zero values, nil channels, and uninitialized struct fields create subtle bugs that can only be prevented through exhaustive code review and linting rather than compiler enforcement. He argues that because it is impossible to solve every problem through language design is no excuse to avoid solving solvable ones—using the analogy that cars are safer than trains, even though drivers can still crash them.

Wenger concludes that Go as a "throwaway" prototyping language is a myth: no organization actually rewrites production systems, so the language persists with all its quirks accumulating over time. Until the industry demands better tools that catch entire categories of errors at compile-time (as Rust demonstrates is possible), developers will continue woken up at night by nil values that should never have existed, perpetuating "the Billion Dollar Mistake" over and over again.

Key Takeaways

About

Author: Amos Wenger

Publication: Fasterthanli.me (personal tech blog)

Published: 2022

Sentiment / Tone

Frustrated but measured; technically rigorous; professorial in tone while being emotionally candid about exhaustion from the recurring defensive arguments. Wenger employs satire and analogy ("hitting yourself in the head with a rake") but backs this up with detailed technical examples. He positions himself as someone genuinely disappointed rather than bitter—someone who wanted Go to work and invested heavily but found the fundamental design philosophy incompatible with building maintainable software at scale. His rhetorical stance is 'I'm not asking for perfection, just for solvable problems to be solved,' which frames his critique as reasonable rather than absolutist. There's clear frustration at what he sees as deliberate bad-faith defensive arguments ('breaking down positions into absurdity'), but he respects the intelligence of other programmers and acknowledges legitimate counterarguments fairly before rebutting them.

Related Links

Research Notes

Amos Wenger (fasterthanlime) is a highly credible voice in this debate with 12+ years of professional software engineering experience across seven companies, plus a history of language design work (he presented a custom language at OSCON 2009). His original "I want off Mr Golang's Wild Ride" article became a focal point for Go criticism and is frequently resurfaced on tech forums, prompting this follow-up. The reception of this article was substantially positive in technical communities. On HackerNews, commenters called it "the most cogent critique of Go I've seen yet." The article generated serious discussions even from Go defenders who acknowledged its validity while disagreeing with its conclusions. On Reddit's r/golang, supporters acknowledged "he's not wrong" while defending Go on other pragmatic grounds (e.g., it works, it's widely adopted, it's better than the alternative of using multiple languages). Important context: Go 1.18 (March 2022) added generics support—a feature Wenger explicitly requested in his original article. However, Go still lacks sum types, proper immutability control, and union types. The fact that Wenger wrote this 2022 critique even after generics arrived suggests he views these as peripheral improvements to deeper architectural issues rather than solutions to the core problems. The article's core thesis about Go becoming an "island" that's hard to move away from has only become more relevant post-2022, as Go adoption in infrastructure (Docker, Kubernetes, many cloud-native tools) has locked entire ecosystems into the language. The criticisms about FFI, ecosystem integration, and interoperability have not improved significantly with language updates. Wenger's specific examples (netaddr.IP's complex workarounds, the zero-value semantics problem) are well-researched and directly sourced from production experiences at companies like Tailscale. His engagement with the counterarguments is fair—he doesn't strawman the 'Go has strengths' position; rather, he acknowledges them and argues they don't justify the design tradeoffs made. One notable aspect: Wenger explicitly defends Rust against the straw-man that he's arguing "Rust is perfect." He notes Rust has legitimate shortcomings (build times, complex borrow checker, no GATs at the time of writing) and acknowledges the pragmatic incremental adoption of Rust in projects like Firefox and Android, which is careful rather than revolutionary.

Topics

Go language criticism Programming language design Type systems and sum types Error handling Language ecosystem interoperability Software engineering trade-offs