Go: the Good, the Bad and the Ugly

 — 1 minute read


Sylvain Wallez summarizes his experiences with Go. The whole article is a pleasure to read and it maintains an impartial, non-judgemental perspective.

This struck me, as it reflects my experience as well.

Go creators deserve a lot of respect, but it looks like Go’s design happened in a parallel universe (or their Plan9 lab?) where most of what happened in compilers and programming language design in the 90’s and 2000’s never happened. Or that Go was designed by system programmers who were also able to write a compiler.

I really don’t get this. CPUs are getting faster and faster, so there’s almost no penalty to move checks, verifications, and guarantees into the compiler. Instead developers are forced to deal with stupid bugs that could be easily caught by the compiler.

Go’s goal was to replace C and C++, and it’s apparent that its creators didn’t look much elsewhere. They missed their target though, as C and C++ developers at Google didn’t adopt it. My guess is that the primary reason is the garbage collector. Low level C developers fiercely reject managed memory as they have no control on what happens and when. They like this control, even if it comes with additional complexity and opens the door to memory leaks and buffer overflows. Interestingly, Rust has taken a completely different approach with automatic memory management without a GC.

That’s really interesting. I don’t know where Sylvain got this insight from. But Google started as Python shop and it seems that still an important part of the development culture.

Let’s put it simply: there is no dependency management in Go. All current solutions are just hacks and workarounds.

This goes back its origins at Google, which famously uses a giant monolithic repository for all their source code. No need for module versioning, no need for 3rd party modules repositories, you build everything from your current branch. Unfortunately this doesn’t work in the open Internet.

I think this is a rather visible symptom of a bigger underlying issue. Go has been designed as Google’s programming language. It is intended to work best at Google.