Wednesday, November 18, 2015

2015 with Go: A Summary

Next up in my line of posts with summaries of stuff I used in 2015 is Go.

Go is a language created by bored self indulgent veteran engineers at Google who believed that the best way to combat global warming and terrorism was to create a new programming language focused on minimalism, concurrency and performance with distributed web applications.

I'm not sure if that really was their intention but for some reason I started using it starting half way through 2015. Here is my experience thus far.


Experience

  • Switched to Go from Node.js
  • First tried when I was trying to fix a corrupt database by reading data from a bunch of different sources and dealing with heavy callbacks in Node got ridiculously hard and annoying
  • Next built a small web service in it using Gin
  • Today I am using it with gRPC to power a mobile app backend
  • Go is the default language of my tech stack these days

Likes

  • Static typing. The fact that I'm calling it out as something I like is because of my past with Perl and JavaScript
  • Goroutines, channels and the select statement make concurrency ridiculously easy
  • Basic data types - covers a lot of ground and I find myself using the uint* types quite often
  • Concurrent garbage collector: see https://blog.golang.org/go15gc
  • Huge standard library and quality third party modules
  • Quality of tooling: go doc, gocode, go fmt, go lint, etc make programming a breeze
  • Soundly thrashed Node.js in every single area for the specific needs I had (I'm sure others have use-cases where Node.js is better though)
  • Cool tools built in Go, like HashiCorp's stuff, goml, groupcache, cockroachdb, influxdb, gRPC (see news), etc
  • Most packages don't depend on non-current distro supplied C and C++ libraries as can often happen with Python

Dislikes

  • Lack of generics and macros (a seriously big turn off)
  • Lack of package versioning support which is still experimental and under construction
  • Build system mandates checking in generated code into version control for being go get capable
  • Situation is improving but there is a lack of officially supported (or quality 3p) drivers for a lot of new databases I wanted to try out - OrientDB being the prime example today
  • Due to the vastness of the standard library, not everything is written as optimally as it should be

Future

  • The Go team has committed itself to improving stability and performance of the core features throughout v1.x (addressing the last point above)
  • Expect a usable package manager by Go 1.7 if not 1.6
  • HTTP2 coming by default in Go 1.6
  • I don't expect generics or macros before we are well into Go 2.x if at all they arrive and even Go 2 looks several years away. I'll be happy to be proven wrong though
  • Being very optimized for distributed services and web applications, there still isn't a code generation oriented idiomatic Go based Rails killer - this is an event waiting to happen
  • I'll launch a product or two entirely powered by Go

No comments:

Post a Comment