Dudi abidesR&D notes · est. chill
← Back to the rack
TalksFebruary 24, 2025· 4 min read

Good Intentions, Bad Outcomes — in Go and Beyond

My Go Israel meetup talk (in Hebrew): how well-meaning design choices — in Go, in policy, in nature — keep producing the exact opposite of what we wanted.

#Talk#Go#Golang#Hebrew
Thumbnail for talk: Good Intentions, Bad Outcomes — in Go and Beyond

▶ Talk recording

YouTube ↗

🎙 Go Israel meetup · Feb 2025 — talk in Hebrew

▦

The slide deck

Follow along or steal the diagrams for your own meetup.

View slides ↗Download .pptx ↓

You meant well. The real world showed up.

That’s the whole talk in one slide. Every system — tax codes, fuel standards, ecosystems, programming languages — is full of mechanisms designed with the best intentions that produced the precise opposite of the goal. I opened with the classics to set the pattern: the Laffer curve on taxation, fuel-economy rules that pushed everyone into SUVs, and Australia’s cane toads, introduced to eat beetles and now eating everything except the beetles.

Then we turned to Go, because Go is full of principled design decisions — and principled decisions have the sharpest unintended edges.

The Go examples

  • No exceptions. Developers like exceptions, so developers reinvent them: panic/recover gymnastics and a graveyard of try() proposals.
  • Explicit error handling. Making every error visible was supposed to end silent failures. At scale it becomes an error-handling explosion — so verbose that developers dodge it with _, and the silence returns through the back door.
  • Frictionless goroutines. Spawning concurrency is so cheap you’ll do it everywhere — until resource exhaustion, leaks, and the kind of race conditions that only reproduce on the customer you like least.
  • Transparent modules. Building packages on top of Git URLs was a gift to open source — and a tax on anyone with proprietary code, who now juggles GOPRIVATE, proxies, and checksum databases.
  • Effortless cross-compilation. It compiles everywhere! It just doesn’t run its tests everywhere — so your users meet the architecture-specific bugs first.
  • GOMEMLIMIT. Cap memory to kill OOMs, and the garbage collector compensates by burning CPU. You solved the crash and bought latency.
  • Readable syntax, no default arguments. var x int reads beautifully until a C veteran’s brain short-circuits — and explicitness everywhere means boilerplate everywhere, routed around with variadic hacks and options structs.

The closer

It doesn’t matter what you planned to enforce: nature always finds a way. Developers will implement their own exceptions, abuse the easy primitives, and route around every guardrail — so design for the workaround, not just the happy path.

The recording is in Hebrew; the deck (linked above, also downloadable as .pptx) is in English and follows the talk slide for slide.