| # Real Go Projects: SmartTwitter and web.go | |
| 19 Oct 2010 | |
| Tags: guest | |
| Summary: How Michael Hoisie used Go to build SmartTwitter and web.go. | |
| OldURL: /real-go-projects-smarttwitter-and-webgo | |
| Michael Hoisie | |
| ## | |
| _This week's article is written by_ [_Michael Hoisie_](http://www.hoisie.com/). | |
| _A programmer based in San Francisco, he is one of Go's early adopters and the author of several popular Go libraries. He describes his experiences using Go:_ | |
| I was introduced to Go by a post on [Hacker News](http://news.ycombinator.com/). | |
| About an hour later I was hooked. At the time I was working at a web start-up, | |
| and had been developing internal testing apps in Python. | |
| Go offered speed, better concurrency support, | |
| and sane Unicode handling, so I was keen to port my programs to the language. | |
| At that time there wasn't an easy way to write web apps in Go, | |
| so I decided to build a simple web framework, | |
| [web.go](http://github.com/hoisie/web.go). | |
| It was modeled after a popular Python framework, | |
| [web.py](http://webpy.org/), which I had worked with previously. | |
| While working on web.go I got involved in the Go community, | |
| submitted a bunch of bug reports, and hacked on some standard library packages | |
| (mainly [http](https://golang.org/pkg/http/) and [json](https://golang.org/pkg/json/)). | |
| After a few weeks I noticed that web.go was getting attention at Github. | |
| This was surprising because I'd never really promoted the project. | |
| I think there's a niche for simple, fast web applications, | |
| and I think Go can fill it. | |
| One weekend I decided to write a simple Facebook application: | |
| it would re-post your Twitter status updates to your Facebook profile. | |
| There is an official Twitter application to do this, | |
| but it re-posts everything, creating noise in your Facebook feed. | |
| My application allowed you to filter retweets, | |
| mentions, hashtags, replies, and more. | |
| This turned into [Smart Twitter](http://www.facebook.com/apps/application.php?id=135488932982), | |
| which currently has nearly 90,000 users. | |
| The entire program is written in Go, and uses [Redis](https://redis.io/) | |
| as its storage back-end. | |
| It is very fast and robust. It currently processes about two dozen tweets per second, | |
| and makes heavy use of Go's channels. | |
| It runs on a single Virtual Private Server instance with 2GB of RAM, | |
| which has no problem handling the load. | |
| Smart Twitter uses very little CPU time, and is almost entirely memory-bound | |
| as the entire database is kept in memory. | |
| At any given time there are around 10 goroutines running concurrently: | |
| one accepting HTTP connections, another reading from the Twitter Streaming API, | |
| a couple for error handling, and the rest either processing web requests | |
| or re-posting incoming tweets. | |
| Smart Twitter also spawned other open-source Go projects: | |
| [mustache.go](http://github.com/hoisie/mustache.go), | |
| [redis.go](http://github.com/hoisie/redis.go), | |
| and [twitterstream](http://github.com/hoisie/twitterstream). | |
| I see a lot of work left to do on web.go. | |
| For instance, I'd like to add better support for streaming connections, | |
| websockets, route filters, better support in shared hosts, | |
| and improving the documentation. | |
| I recently left the start-up to do software freelancing, | |
| and I'm planning to use Go where possible. | |
| This means I'll probably use it as a back end for personal apps, | |
| as well as for clients that like working with cutting edge technology. | |
| Finally, I'd like to thank the Go team for all their effort. | |
| Go is a wonderful platform and I think it has a bright future. | |
| I hope to see the language grow around the needs of the community. | |
| There's a lot of interesting stuff happening in the community, | |
| and I look forward to seeing what people can hack together with the language. |