The March Towards Go

marching Today, TJ Holowaychuk, one of node.js’ most prolific module writers (express, jade, mocha, koa) has announced he’s leaving node.js for Go:

I’ve been fighting with Node.js long enough in production now that I don’t enjoy working with it anymore unfortunately, so at least for now this my formal farewell!


Node does some things well, but ultimately it’s not the right tool for the type of software I’m interested in these days. I still plan on using Node for web sites.


The more I’ve been working with distributed systems, the more I’m frustrated by Node’s direction, which favors performance over usability and robustness. In the past week I’ve rewritten a relatively large distributed system in Go, and it’s robust, performs better, it’s easier to maintain, and has better test coverage since synchronous code is generally nicer and simpler to work with.

TJ is not the first high-profile “noder” to leave for Go. A year and a half ago, Felix Geisendoerfer (author of node-mysql and node-formidable, among other well-known npm modules) tweeted:

bye #nodejs, hello #golang


#golang is technically better in almost every conceivable aspect

Some visible node.js-based start-ups are also making the switch, such as Koding (which provides a web-based development environment):

We’re not trying to say nodejs is bad in general. for some use cases it may be awesome. we didn’t feel any of its shortcomings when our codebase was small, when our userbase was smaller than 1000 users. it became bad for us when we had hundred thousand users, and we moved away as quickly as we could.

Go is amazingly stable and awesome. I can’t begin to list why everything about it is just great.


I wrote my first server with it in 2010, when it didn’t even have a proper database library. I wrote Koding’s first command execution server using it’s OS library, it processed at least a billion system commands much better than anything else that was out there.

And PopTip:

PopTip’s problems with Node started about two years ago. Falter said she knew how to write JavaScript and thought she could use that background to learn Node. The speed of development made it easy for the company to get started with Node.


PopTip helps companies provide a statistical breakdown on public consensus. Its clients include CNN, L’Oreal, Spotify, and a host of others. The size of these customers required PopTip to scale its code. Its service depends on machine learning and streaming data. As the company scaled, the task of administration became increasingly complex, due to “call-back soup”, a common complaint with Node.js.


The switch came when one of PopTip’s engineers spent a weekend replicating the core processing structure with Go. Text processing increased 64 percent just by moving from Node to Go. PopTip formally evaluated Go,and it passed the scorecard test: it had the runtime speed, the cost to administer was minimal, the talent pool was excellent, and competing frameworks were not vying for the attention of the developers.

It’s not just node.js users making the switch. Others are too.

One of Python’s most visible users, Dropbox — who also employs Python’s creator Guido van Rossum — recently announced it has migrated major parts of its back-end infrastructure from Python to Go:

Dropbox owes a large share of its success to Python, a language that enabled us to iterate and develop quickly. However, as our infrastructure matures to support our ever growing user base, we started exploring ways to scale our systems in a more efficient manner. About a year ago, we decided to migrate our performance-critical backends from Python to Go to leverage better concurrency support and faster execution speed. This was a massive effort–around 200,000 lines of Go code–undertaken by a small team of engineers. At this point, we have successfully moved major parts of our infrastructure to Go.

And, less surprisingly, Google is also switching projects over:

  • serves Googles downloads [Chrome, Android SDK, Earth, etc.]
  • Was written in C++
  • Now in Go
  • Now much better [more maintainable]

Naturally, it’s not just existing projects making the switch.

New high-profile projects are also started using Go. Most well-known is probably Docker. Many project using Docker under the hood are also written in Go, such as Flynn, a Docker-based PaaS.

Go 1.0 was only released 2 years ago. Clearly there’s a lot of momentum to use it for building high-performance web servers now. It’s fast, easy to distribute (because it produces a single statically linked binary) and has good async features without “callback hell.”

Not looking at Go yet? It may be a good time to do so now — everybody else is.

Discussion on Reddit and Hacker News.

Got something to say?
  1. Coding Ninja says:

    I suspect we will be here again in a few years with developers blogging about moving away from Go to language X

  2. ofr says:

    Those fads are getting old … please write another blog post when those guys are dumping Go when they discover that there is a better language with type inference, better safety and generics (i.e. Rust)

  3. fighne says:

    I think the people involved with the Go language and their background history make this language one that will last. Don’t get me wrong I’m not saying this is the only tool for the job, but it does fit well for server side code.

  4. alex says:

    I keep seeing people say things like ofr, “when they discover that there is a better language” – trouble is there were already probably better languages out there depending how you define better. But Go lets people do real things easily without needing the whole tick list of language greatness.

    Better is a definition.

  5. gleber says:

    Here’s a great writeup why Go is not a good language:

  6. Joppu says:

    Here we Go again…

  7. andrew says:

    Rust is not a useful language without stability. Perhaps in 3 years, by then Go / Go 2.0 will be pretty well refined.

  8. Tim says:

    On HN, people are already speculating that this is just part of a larger migration that will end up at Rust or similar (“thereby completing the migration away from dynamic scripting”). Can’t say I disagree too much.

    I really wonder what’ll happen once this part of the cycle completes. Performance should be awfully difficult to beat at that point, especially without reverting to the unsafe features people are trying to avoid, so what’s next? A language with expressive dependent types? At least there’s ample time left to figure out what to do post-Node, post-Go, post-Rust.

    Oh, and before I forget, you can track Rust’s web readiness here:

  9. Since when is evolution a fad? The day people stick to a platform because it is “the best solution” is by definition the day stagnation begins.

  10. ofr, nobody is saying that Go is the ultimate programming language. Of course, at some point, it may be be replaced by something else. But Rust or Haskell, in their current form, are probably not the ultimate programming languages either.

    The question is: is Go (or Rust or Haskell) a good language for industrial work for the next 10 years? A lot of people think so.

    People are not abandoning Node.js for Go because it’s more trendy. People usually don’t abandon a technology they rely on for their work just because of fashion. Some people abandon Node.js because they have real problems with managing complexity (especially because of callbacks) and error handling.

    Hindley Milner type inference, better safety and generics are useful features for sure. But they also bring their share of complexity in terms of language specification and implementation.

    In practice, Go programmers usually don’t meet situations where the lack of better type inference, better safety or generics creates a problem, a problem big enough for looking elsewhere. This is the reason, in my opinion, your comparison of programmers moving from Node to Go, then from Go to something else is not adequate.

  11. Boris Uber says:

    These Go promoting blogs are getting on my nerves, no offense I use any lang that best suits the job. I am one nerv close to write a Go-to-Butt chrome extension.

    It is disgusting that these community respected opensource programmers are being such naive. Anyone got out of campus and had their hands dirty on real-life projects knows that “No programming language is perfect”, they are all tools like in your basement, you stand and cross arms and think and pick up the one that does the job.

    Golang is simply not ready, package is miles away from completion of Node, interactive debugging is worse even compared to Node. Don’t even get me started on team coordination, deployment and those infrastructure IT buddies sitting over there.

  12. ofr says:

    @andrew, I wasn’t advocating Rust in particular, that was just an example. All that programming business has become a bit too fashion-ridden … as if there’s no existing language that can solve a certain problem.

  13. ofr says:

    @Nicolas, it’s not about the ultimate programming language, that will probably never exist. It is about the hype surrounding certain programming languages and associated programming techniques.

    I actually like many new recent developments such as Node.js or Go, but the hyperbole around them is just ridiculous: one day it’s the one and only solution for building web applications, the next the it’s the worst thing ever and everybody should move on to another technology.

    I am not advocating Java, but no one (on certain blogs etc) seems to talk about it, while it still dominates large parts of the industry. It has a highly optimised VM and the new iterations of the language offer modern programming features, too. Also, it is one of the most mature environments for writing reliable web applications…

  14. Ox Cart says:

    I don’t think this article was meant to bash any other languages, simply to point out that there are people who are finding Go useful for solving certain problems. I’ve written applications in a variety of platforms, mostly Java, a fair amount of Python, a little NodeJS and now more and more Go, and I find that Go has a lot going for it.

    Java – very performant and mature runtime environment, static type checking helps with maintainability and working on large teams, has a great ecosystem of libraries, able to scale up to multi-core in a single process. It’s not the most productive language (too many nouns, not enough verbs), doesn’t have the most elegant concurrency primitives, requires 3rd party libraries to make non-blocking I/O palatable and suffers from framework-itis in its ecosystem.

    Python – great ecosystem, productive (initially) and just fun to work with. IMHO, lack of static typing hurts maintainability in large team settings (yes, I know there are counter examples, but this is just in my personal experience). Also, the GIL means that you have to jump through hoops to make it scale up.

    NodeJS – I never liked NodeJS very much. The fact that it’s JavaScript lowers the barrier to entry for people who already happen to know JavaScript, the V8 virtual machine is a really nice, and NPM is great, but the fact that it lacks static typing, requires callbacks for doing any I/O and doesn’t support multi-threading make it a real pain for building complex networked software.

    Go – I think Go occupies a pretty nice sweet spot between Java and Python. The design of the language and the speed of the compiler make it feel almost as productive as working with a dynamic language, while static typing, a standardized code format and a very constrained language spec make it easy to write maintainable code. Non-blocking I/O without callbacks is a killer feature for anyone writing networked programs, and the ecosystem of 3rd party libraries is already filling in quite nicely. And, unlike Java, Go libraries tend to be very tight and focused, and framework-itis has certainly not set in yet.

  15. bacon says:

    rust is a giant freaking language. it’s a friendlier c++. people who think it’s a direct competitor with go for many uses is bloody mad.

  16. Anssi says:

    Go is..

    “90% Perfect, 100% of the time”

    (“GoCon Tokyo” 31 May 2014 Brad Fitzpatrick)

    You need exactly the right tool for the job. You want the slickest modern power tools and great safety equipment.


    But often, very often, you want your beloved standard grease monkey toolbox, which must be good enough for most jobs. Go is a nice step towards fixing everything with 90% perfection: enough of fast, easy, safe, cheap, manageable, modern, beautiful.

  17. FlipOne says:

    Zef, are you switching to Go, too?

    I’ve actually just begun to use Node.js. Reading this now places me on the fence between Go and Node.js. Your confirmed conversion to Go will most likely get me over the fence.

    Will appreciate your own take on it.

  18. Zef Hemel says:

    I don’t currently run any big server apps. The ones I do run are using Go (zedrem) and Python.

  19. Constantine says:

    I can’t stress this enough, but I find this guy extremely annoying. YES I am aware of who he is and YES I do use his tools, but whatever dude; go to Go, no one cares…

Trackbacks for this post

  1. Another Respected Developer Says Farewell to Node.js and Hello to Go | The New Stack
  2. Crisis in the House of Node.js? | Rambling Mind Blasts
  3. Rust will be the language of the future | Christoph Burgdorf's Blog

Comments are closed now.