Program your next server in Go

Sameer Ajmani
Manager, Go team
Google
@Sajma
sameer@golang.org

* Video

This talk was presented at the [[http://applicative.acm.org/][ACM Applicative]] conference in New York City on June 1, 2016.

(We'll link the video here when it's ready.)

* Outline

1. What is Go, and who uses it?
2. Comparing Go and other languages
3. Code examples
4. Concurrency
5. Getting started

* What is Go?

"Go is an open source programming language that makes it easy to build simple, reliable, and efficient software."

.link http://golang.org

* History

Design began in late 2007.

- Robert Griesemer, Rob Pike, and Ken Thompson.
- Ian Lance Taylor and Russ Cox.

Open source since 2009 with a very active community.

Language stable as of Go 1, early 2012.

Go 1.7 is coming this August.

* Why Go?

Go is an answer to problems of scale at Google.

.image ../2012/splash/datacenter.jpg 500 _

* System Scale

- designed to scale to 10⁶⁺ machines
- everyday jobs run on 1000s of machines
- jobs coordinate, interact with others in the system
- lots going on at once

Solution: great support for concurrency

.image ../2012/waza/gophercomplex6.jpg

* A Second Problem: Engineering Scale

In 2011:

- 5000+ developers across 40+ offices
- 20+ changes per minute
- 50% of code base changes every month
- 50 million test cases executed per day
- single code tree

Solution: design the language for large code bases

* Who uses Go at Google?

Hundreds of projects. Thousands of Go programmers. Millions of lines of Go code.

Public examples:

- Flywheel: SPDY proxy for Chrome on mobile devices

.image applicative/spdy.png 400 _

* Who uses Go at Google?

Hundreds of projects. Thousands of Go programmers. Millions of lines of Go code.

Public examples:

- Flywheel: SPDY proxy for Chrome on mobile devices
- dl.google.com: Download server for Chrome, ChromeOS, Android SDK, Earth, etc.
- Vitess: YouTube MySQL balancer
- Seesaw: Linux Virtual Server (LVS) based load balancer
- Lingo: Logs analysis in Go, migrated from Sawzall

The target is networked servers, but Go is a great general-purpose language.

* Who uses Go besides Google?

.link http://golang.org/wiki/GoUsers

Aerospike, BBC Worldwide, Bitbucket, Booking.com, Core OS, Datadog, Digital Ocean, Docker, Dropbox, Facebook, Getty Images, GitHub, GOV.UK, Heroku, IBM, Intel, InfluxDB, Iron.io, Kubernetes, Medium, MongoDB, Mozilla services, Netflix, New York Times, pool.ntp.org, Rackspace, Shutterfly, SmugMug, SoundCloud, SpaceX, Square, Stack Exchange, Thomson Reuters Eikon, Tumblr, Twitch, Twitter, Uber, VMWare ...

.image ../2014/state-of-go/bus.jpg 300 _

* Comparing Go and other languages

* "Go: 90% Perfect, 100% of the time" -bradfitz, 2014

.image ../2014/gocon-tokyo/funfast.svg

# Brad Fitzpatrick, GoCon Tokyo, May 2014

* Go has much in common with Java

- C family (imperative, braces)
- Statically typed
- Garbage collected
- Memory safe (nil references, runtime bounds checks)
- Variables are always initialized (zero/nil/false)
- Methods
- Interfaces
- Type assertions (`instanceof`)
- Reflection

* Go differs from Java in several ways

Fast, efficient for computers:

- Programs compile to machine code.  There's no VM.
- Control over memory layout, fewer indirections

Fun, fast for humans:

- Simple, concise syntax
- Statically linked binaries
- Function values and lexical closures
- Built-in strings (UTF-8)
- Built-in generic maps and arrays/slices
- Built-in concurrency

* Go intentionally leaves out many features

- No classes
- No inheritance
- No constructors
- No `final`
- No exceptions
- No annotations
- No user-defined generics

* Why does Go leave out those features?

Clarity is critical.

When reading code, it should be clear what the program will do.

When writing code, it should be clear how to make the program do what you want.

Sometimes this means writing out a loop instead of invoking an obscure function.

(Don't DRY out.)

For more background on design:

- [[http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html][Less is exponentially more (Pike, 2012)]]
- [[http://talks.golang.org/2012/splash.article][Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)]]

* Code examples

* Go looks familiar

Hello, world!

.play applicative/hello/hello.go

* Hello, web server

.play applicative/hello/server.go

Types follow names in declarations.
Exported names are Capitalized.  Unexported names are not.

* Example: Google Search frontend

.play applicative/frontend.go /func main/,/func handleSearch/

.link http://localhost:8080/search
.link http://localhost:8080/search?q=golang
.link http://localhost:8080/search?q=golang&output=json
.link http://localhost:8080/search?q=golang&output=prettyjson

* Validate the query

.code applicative/frontend.go /func handleSearch/,/ENDQUERY/

`FormValue` is a method on the type `*http.Request`:

  package http
  type Request struct {...}
  func (r *Request) FormValue(key string) string {...}

`query`:=`req.FormValue("q")` initializes a new variable `query` with
the type of the expression on the right hand side, `string`.

* Fetch the search results

  import "golang.org/x/talks/2016/applicative/google"
  
.code applicative/frontend.go /Run the Google search/,/ENDSEARCH/

`Search` returns two values, a slice of results and an error.
The results are valid only if the error is nil.

  type error interface {
      Error() string // a useful human-readable error message
  }

Errors may contain additional information, accessed via type assertions.

* Structure the search results

.code applicative/frontend.go /Create the structured/,/ENDRESPONSE/

The `response` type is defined locally within `handleSearch`.

The `google.Result` type is exported from package `google`:

  package google
  
  type Result struct { Title, URL string }

The `resp` variable is initialized to a `response` value using a composite struct literal.


* Render the search results

.code applicative/frontend.go /Render the response/,/ENDRENDER/

Each case writes bytes to an `io.Writer`:

  type Writer interface {
          Write(p []byte) (n int, err error)
  }

`http.ResponseWriter` implements the `io.Writer` interface.

* HTML templates operate on Go values

.play applicative/frontend.go /var responseTemplate/,/\)\)/

.image applicative/frontend-screenshot.png _ 900

* That's it for the search handler

All the packages are from the standard library:

  import (
      "encoding/json"
      "fmt"
      "html/template"
      "log"
      "net/http"
      "time"
  )

Go servers scale well: each request runs in its own _goroutine_.

Let's talk about concurrency.

* Communicating Sequential Processes (Hoare, 1978)

Concurrent programs are structured as independent processes that
execute sequentially and communicate by passing messages.

Sequential execution is easy to understand.  Async callbacks are not.

*Go*primitives:* goroutines, channels, and the `select` statement.

* Goroutines

Goroutines are like lightweight threads.

They start with tiny stacks and resize as needed.

Go programs can have hundreds of thousands of them.

Start a goroutine using the `go` statement:

  go f(args)

The Go runtime schedules goroutines onto OS threads.

Blocked goroutines don't use a thread.

* Channels

Channels provide communication between goroutines.

  c := make(chan string)

  // goroutine 1
  c <- "hello!"

  // goroutine 2
  s := <-c
  fmt.Println(s) // "hello!"

* Select

A `select` statement blocks until communication can proceed.

  select {
  case x := <-in:
    fmt.Println("received", x)
  case out <- v:
    fmt.Println("sent", v)
  }

Only the selected case runs.

* Example: Google Search (backend)

Q: What does Google search do?

A: Given a query, return a page of search results (and some ads).

Q: How do we get the search results?

A: Send the query to Web search, Image search, YouTube, Maps, News, etc., then mix the results.

How do we implement this?

* Google Search: A fake framework

We can simulate a back end search with a random timeout up to 100ms.

.code applicative/google/fake.go /START2/,/STOP2/

* Google Search: Test the framework

.play applicative/google-serial.go /func.main/,/}/ HLsearch

* Google Search (serial)

The `Search` function takes a query and returns a slice of `Results`.

Search invokes the Web, Image, and Video searches serially, then constructs the `results` slice.

.code applicative/google/serial.go /func Search/,/^}/
.play applicative/google-serial.go /google.Search/

* Google Search (parallel)

Run the Web, Image, and Video searches concurrently, and wait for all results.

The `func` literals are closures over `query` and `c`.

.code applicative/google/parallel.go /func Search/,/^}/
.play applicative/google-parallel.go /google.Search/

* Google Search (timeout)

Don't wait for slow servers.

.code applicative/google/timeout.go /func Search/,/STOP/
.play applicative/google-timeout.go /google.Search/ HLsearch

* Avoid timeout

Q: How do we avoid discarding results from slow servers?

A: Replicate the servers.  Send requests to multiple replicas, and use the first response.

.code applicative/google/first.go /func First/,/^}/

* Using the First function

.play applicative/first.go /func main/,/^}/

* Google Search (replicated)

Reduce tail latency using replicated back ends.

.code applicative/google/first.go /START/,/STOP/
.play applicative/google-replicated.go /google.Search/

Go functions have simple, synchronous signatures.
The use of concurrency is encapsulated.

* What just happened?

In just a few simple transformations we used Go's concurrency primitives to convert a

- slow
- sequential
- failure-sensitive

program into one that is

- fast
- concurrent
- replicated
- robust.

No locks. No condition variables. No futures. No callbacks.

* Getting started

* You're interested in Go.  What next?

Take the Go Tour online.

.link http://tour.golang.org

Then go deeper ...

.link http://golang.org/wiki/Learn

Still interested?

Run a pilot project.

* Run a pilot project

Reduces the cost & risks of switching to a new technology,
while helping your organization discover the benefits.

1. Choose something small to write in Go (e.g., a microservice)
2. Build a prototype with a friend

- Find the libraries you need
- Integrate with editors & IDEs
- Integrate with build & test & deploy
- Learn how to debug & profile your program

3. Compare Go to what you use today 

- Isolate the language change; try not to change anything else.

4. *Present*results*to*the*team*

* Go is designed for tooling

Go tools meet you where you are.  There's no one "Go IDE".

- IDE & editor integration: Eclipse, IntelliJ, VisualStudio, SublimeText, emacs, vim, ...
- [[http://play.golang.org][play.golang.org]]: online playground
- `gofmt`: automatic formatting
- `goimports`: automatic updates of package imports
- `gocode`: automatic completion
- the `go` tool: automatic fetch & build
- `guru`: static analysis, bug finding, code navigation
- [[http://godoc.org][godoc.org]]: open source package index and docs

* Where to Go next

Take the Go Tour online.

.link http://tour.golang.org

Lots more material.

.link http://golang.org/wiki/Learn

Great community.

.link http://golang.org/project
