Go for Java Programmers

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

* Video

This talk was presented at [[http://javasig.com][NYJavaSIG]] on April 23, 2015.

.link https://www.youtube.com/watch?v=_c_tQ6_3cCg Watch the talk on YouTube

* 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 / go.dev

* 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 /wiki/GoUsers go.dev/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)]]
- [[/talks/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 automatically.  No options.

Goimports updates import statements based on your workspace.

Most people run these tools on save.

.link /play/p/GPqra77cBK go.dev/play/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 https://pkg.go.dev

* 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 /tour/ go.dev/tour

Lots more material.

.link /wiki/Learn go.dev/wiki/Learn

Great community.

.link /project go.dev/project
