Go for Java Programmers

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

* Outline

1. What is Go, and who uses it?
2. Comparing Go and Java
3. Examples
4. Concurrency
5. Tools

# The next several slides are from rsc's 2013/distsys and 2015/mit talks.

* 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.

* 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?

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

Public examples:

- SPDY proxy for Chrome on mobile devices

.image go-for-java-programmers/spdy.png 400 _

* Who uses Go at Google?

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

Public examples:

- SPDY proxy for Chrome on mobile devices
- Download server for Chrome, ChromeOS, Android SDK, Earth, etc.
- YouTube Vitess MySQL balancer

The target is networked servers, but it's a great general-purpose language.

* Who uses Go besides Google?

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

Apcera, Bitbucket, bitly, Canonical, CloudFlare, Core OS, Digital Ocean, Docker, Dropbox, Facebook, Getty Images, GitHub, Heroku, Iron.io, Kubernetes, Medium, MongoDB services, Mozilla services, New York Times, pool.ntp.org, Secret, SmugMug, SoundCloud, Stripe, Square, Thomson Reuters, Tumblr, ...

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

* Comparing Go and Java

* Go and Java have much in common

- 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

- Programs compile to machine code.  There's no VM.
- Statically linked binaries
- Control over memory layout
- 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 constructors
- No inheritance
- 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)]]

* Examples

* Go looks familiar to Java programmers

Main.java

.code go-for-java-programmers/hello/Main.java

hello.go

.play go-for-java-programmers/hello/hello.go

* Hello, web server

.play go-for-java-programmers/hello/server.go

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

* Example: Google Search frontend

.image go-for-java-programmers/frontend-screenshot.png _ 1000

.play go-for-java-programmers/frontend.go /func main/,/func handleSearch/

* Validate the query

.code go-for-java-programmers/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

.code go-for-java-programmers/frontend.go /Run the Google search/,/ENDSEARCH/

`Search` returns two values, a slice of results and an error.

  func Search(query string) ([]Result, 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.

* Render the search results

.code go-for-java-programmers/frontend.go /Render the/,/ENDRENDER/

`resultsTemplate.Execute` generates HTML and writes it 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 go-for-java-programmers/frontend.go /A Result contains/,/\)\)/

* Issue the query to the Google Search API

.code go-for-java-programmers/frontend.go /func Search/,/resp.Body.Close/

The `defer` statement arranges for `resp.Body.Close` to run when `Search` returns.

* Parse the JSON response into a Go struct

.link https://developers.google.com/web-search/docs/#fonje

.code go-for-java-programmers/frontend.go /var jsonResponse/,/^}/

* That's it for the frontend

All the packages are from the standard library:

  import (
  	"encoding/json"
  	"fmt"
  	"html/template"
  	"log"
  	"net/http"
  	"net/url"
  	"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.

"Don't communicate by sharing memory, share memory by communicating."

*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 n := <-in:
    fmt.Println("received", n)
  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 Search function with a random timeout up to 100ms.

.code go-for-java-programmers/google-serial.go /START2/,/STOP2/

* Google Search: Test the framework

.play go-for-java-programmers/google-serial.go /func.main/,/}/

* Google Search (serial)

The Google function takes a query and returns a slice of Results (which are just strings).

Google invokes Web, Image, and Video searches serially, appending them to the results slice.

.play go-for-java-programmers/google-serial.go /START1/,/STOP1/

* 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`.

.play go-for-java-programmers/google-parallel.go /Google/,/^}/

* Google Search (timeout)

Don't wait for slow servers.

No locks.  No condition variables.  No callbacks.

.play go-for-java-programmers/google-timeout.go /START/,/STOP/

* 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 go-for-java-programmers/first.go /START1/,/STOP1/

* Using the First function

.play go-for-java-programmers/first.go /START2/,/STOP2/

* Google Search (replicated)

Reduce tail latency using replicated search servers.

.play go-for-java-programmers/google-first.go /START/,/STOP/

* And still…

No locks.  No condition variables.  No callbacks.

* Summary

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.

* Tools

* Go has great tools

- gofmt and goimports
- the go tool
- godoc
- IDE and editor support

The language is designed for tooling.

* gofmt and goimports

Gofmt formats code is formatted automatically.  No options.

Goimports updates import statements based on your workspace.

Most people run these tools on save.

.link http://play.golang.org/p/GPqra77cBK

* The go tool

The go tool builds Go programs from source in a conventional directory layout.
No Makefiles or other configs.

Fetch the `present` tool and its dependencies, build it, and install it:

  % go get golang.org/x/tools/cmd/present

Run it:

  % present

* godoc

Generated documentation for the world's open-source Go code:

.link http://godoc.org

* IDE and editor support

Eclipse, IntelliJ, emacs, vim, many others.

- `gofmt`
- `goimports`
- `godoc` lookups
- code completion
- code navigation

There's no "Go IDE".

Go tools meet you where you are.

* 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
