How Go was made
GopherCon Closing Keynote
9 Jul 2015

Andrew Gerrand
adg@golang.org


* This talk

How was Go made?

What was its development process?

How has the process changed?

What is its future?

.image how-go-was-made/gopherswrench.jpg 300 _


* The early days


* Three friends

Robert Griesemer, Rob Pike, and Ken Thompson's thought experiment:

"What should a modern, practical programming language look like?"


* The early process

Design discussions by mail and in-person.

Consensus-driven:
A feature was accepted only when *all* the three authors agreed it necessary.

Most proposed changes were rejected.


* The initial spec

The first artifact of Go was the language specification.

The first commit (now git hash `18c5b48`) was a draft of that spec:

	Author: Robert Griesemer <gri@golang.org>
	Date:   Sun Mar 2 20:47:34 2008 -0800

	    Go spec starting point.

Go's entire history is preserved in the core reposistory.


* The first Go program 

The first Go program was a Prime Sieve, and was included in the spec.

	func Filter(in *chan< int, out *chan> int, prime int) {
	  for {
	    i := <in;  // Receive value of new variable 'i' from 'in'.
	    if i % prime != 0 {
	      >out = i  // Send 'i' to channel 'out'.
	    }
	  }
	}

	func Sieve() {
	  ch := new(chan int);  // Create a new channel.
	  go Generate(ch);  // Start Generate() as a subprocess.
	  for {
	    prime := <ch;
	    printf("%d\n",  prime);
	    ch1 := new(chan int);
	    go Filter(ch, ch1, prime);
	    ch = ch1
	  }
	}


* Version control

Subversion was the project's first version control system. (no code review!)
The trio made 400 commits to Subversion.

The last Subversion commit (git hash `777ee7`, 21 July 2008) contained:

- the spec,
- a Go compiler (linux/darwin amd64),
- a few packages (fmt, rand, and math),
- some test programs.

`test/helloworld.go`:

	package main

	func main() {
		print "hello, world\n";
	}


* Getting serious
 
In July 2008 the project migrated from Subversion to Perforce,
to use Google's excellent code review system.

The team grew:

- Russ Cox joined in August 2008,
- Ian Lance Taylor joined in September,
- ~20 other Googlers got involved in their 20% time.


* Early changes

It was easy to make changes in those days.
Everyone knew each other.
There were ~0 users.
All the source code in one place.

Workflow informal, but design-oriented.


* Waiting for good design (1/2)

Many problems don't have obvious solutions.

The team were prepared to wait until they found the correct design.

For example:

The `fmt` package was written long before `reflect`.
Before then, `fmt` had an awkward chaining API:

	fmt.New().s("i = ").d(i).putnl()

Now: 

	fmt.Println("i = ", i)


* Waiting for good design (2/2)

Another example:

Slices took more than a year to figure out.
Before then, there were "open arrays" but they were awkward.

`src/lib/container/vector.go` @ `f4dcf51`:

	// BUG: workaround for non-constant allocation.
	// i must be a power of 10.
	func Alloc(i int) *[]Element {
		switch i {
		case 1:
			return new([1]Element);
		case 10:
			return new([10]Element);
		case 100:
			return new([100]Element);
		case 1000:
			return new([1000]Element);
		}
		print "bad size ", i, "\n";
		panic "not known size\n";
	}


* An early language change

`chan` and `map` were originally spelled `*chan` and `*map`.

The team had a meeting to discuss removing the asterisks.

Russ implemented the compiler change (`dc7b2e9`),
and updated ~every Go file in existence (`08ca30b`).

.code how-go-was-made/mapchan.diff

This rapid approach works well at a small scale.


* Toward open source

In mid-2009 the team prepared for the open source release.

Moved to their third version control system:
Mercurial, with Rietveld for code review.
# (We would go on to use these tools for five years.)

The last Perforce commit (`9e96f25`, Oct 29) contained

- a mature spec and compiler,
- a broad standard library (82 packages),
- gofmt, godoc, cgo,
- the testing framework,
- the FAQ, Effective Go, and more.


* Open source


* The release

10 November 2009: Go was released. (`78c47c3`)

.image how-go-was-made/website.png 500 _


* The response

There was a huge response to the release. The team was overwhelmed.

People sent changes from day one. The first non-Googler change:

	commit 022e3ae2659491e519d392e266acd86223a510f4
	Author: Kevin Ballard <kevin@sb.org>
	Date:   Tue Nov 10 20:04:14 2009 -0800

	    Fix go-mode.el to work on empty buffers
	    
	    Fixes #8.
	    
	    R=agl, agl1, rsc
	    https://golang.org/cl/153056

In the first month, 32 people from outside Google contributed to Go.

The contribution process worked.


* Changes after the release

The team continued to make big changes after the release.

But the process was now different, as they now had a community.


* The first major public change (1/2)

On December 9th, Rob Pike sent the first public change proposal.

He proposed to remove semicolons at line endings.
[[https://golang.org/s/semicolon-proposal][golang.org/s/semicolon-proposal]]

The proposal was a "design doc" that included:

- background,
- rationale,
- a formal specification of the change,
- an implementation plan, and
- examples (including a copy of the Prime Sieve program without semicolons).


* The first major public change (2/2)

The design doc was shared with the community for feedback.

"Please read the proposal and think about its consequences.
We're pretty sure it makes the language nicer to use and sacrifices almost nothing in precision or safety."

The response was positive.

The proposal was implemented.

Most of the changes were made mechanically (thanks `gofmt`)).

This would be the shape of things to come.


* Curating change

* Curating change

The team was careful to curate the changes that made it into the language.
(Remember: "Wait for good design.")

There were many proposed changes and additions to Go.

As before, many more were declined than accepted.

Some fit with the project's goals, others did not.

An early accepted proposal:

- Make the upper and lower bounds of slice operations optional. (`x[lo:]`, `x[:hi]`)

And a declined proposal:

- Allow negative indices in slice operations. (`x[-n]` `==` `x[len(x)-n]`)


* Communicating goals

At first, we did a poor job explaining the project's goals and development process.

This caused frustration. ("Why don't they accept my suggestions?")

It took us a while to articulate it:
Rob Pike's [[http://talks.golang.org/2012/splash.article][talk]] in October 2012
"Go at Google: Language Design in the Service of Software Engineering"
was the first thorough explanation of Go's _raison_d'être_.

I wish we'd had this document written in 2009.
(But we couldn't have written it then.)

Read it, if you haven't already.


* A thought on openness

What if Go has been open source from day one?

It may have been easier for the public to understand the project.

But it's not that simple:

Ideas are fragile in their early stages; they need to be nurtured before exposed to the world.


* Managing change

* Weekly snapshots

Attempt to keep everyone in sync.

- Apply a Mercurial tag to a specific, stable revision.
- Announce to user mailing list with detailed changelog.

Great for early adopters and core developers.


* Problems with weeklies

Contributors work at tip; users sync to weeklies.

Burden on users:

- annoying to update weekly,
- painful to update less often.

Version skew results because users are at different weeklies.

Skew fragments the community and slows adoption.


* Formal release process

March 2011: introduced releases every 1-2 months.

- Pick the most stable of the past few snapshots and tag it.
- Announce with abridged "must read" release notes.

Keeps the community more in sync. Reduces churn.

Popular with users.

But skew still prevalent: adventurers and core devs still use weeklies (or tip!).


* Introducing Gofix

A tool to mechanically update code to accommodate language and library changes.

  gofix prog.go

Announced in May 2011.

Eases the burden of staying current.
Release notes now mostly say "run gofix."

Not a sed script. Works on the AST.


* A gofix example

The `reflect` API was completely redesigned in 2011.
Gofix made most of the changes:

.image how-go-was-made/reflect1.png _ 1000
.image how-go-was-made/reflect3.png _ 1000
.image how-go-was-made/reflect2.png _ 1000


* Versioning issues persist

Gofix is no panacea.

As the root of the dependency graph, a programming language can suffer acutely from version skew.

The fundamental issue remains:
Code you write today may not compile tomorrow.

Some companies unwilling to bet on Go as they saw it as unstable.


* A need for stability

Gofix makes changes very easy, and also makes it easy to experiment.
But it can't do everything.

Priorities: If change is easy, what change is important?

Wanted to make major changes to the language and libraries,
but this requires planning.

Decision: design and implement a stable version of Go, its libraries, and its tools.


* Go 1

* What is Go 1?

A specification of the language and libraries that will be supported for years.

Available as downloadable binary packages.

An opportunity to:

- fix minor language irritations,
- fix inconsistencies in the standard library,
- focus on bug fixing and cleaning up TODOs,
- design and build a strong build tool set (get rid of make),
- bring Windows support up to par.

Polish and refine, not redesign.


* Planning Go 1

The team at Google prepared a detailed design document.

Implemented (but did not commit) many of the proposed changes.

Met for a week to discuss and refine the document (October 2011).

Presented the document to the community for discussion.

Community feedback essential in refining the document.

.link http://blog.golang.org/preview-of-go-version-1


* An example: errors (1/5)

Before Go 1, there was no error type.
Instead, the `os` package provided an `Error` type:

	package os

	type Error interface {
		String() string
	}

References to `os.Error` were ubiquitous.

	package io

	type Reader interface {
		Read(p []byte) (n int, err os.Error)
	}
	
	type Closer interface {
		Close() os.Error
	}



* An example: errors (2/5)

Before the Go 1 meeting, Russ raised the issue in the design document:

.image how-go-was-made/errors-issue.png 500 _


* An example: errors (3/5)

At the meeting the team discussed the issue,
Russ presented data from his experiments with the change,
and we made a tentative decision:

.image how-go-was-made/errors-discussion.png 350 _ 


* An example: errors (4/5)

On the list, the community made some keen suggestions:

.image how-go-was-made/errors-rog.png 500 _ 


* An example: errors (5/5)

Many of those suggestions were rolled into the Go 1 design document:

.image how-go-was-made/errors-final.png 500 _


* Implementing Go 1

Create many new issues on the tracker.

Contributors nominate themselves to address specific issues.

Stop developing new features; prioritize stability.


* The success of Go 1

The Go 1 release in March 2012 heralded a new era for the project.

Users appreciated the stability. Huge uptick in community growth.

.image how-go-was-made/trends.png

Contributors focused on implementation, tools, and ecosystem.


* The release cycle

The next release was Go 1.1, more than a year after Go 1.

This is too long; switch to a 6-month release cycle.

Stuck to this plan for 1.2, 1.3, and 1.4, and we're (almost) on track for 1.5.


* The future of change


* A question

Go's development process emphasizes up-front design.

The project has ~450 contributors and many committers from outside Google.

But most change proposals
(despite being driven by community feedback)
were made by the Go team at Google.

Why is this?


* Contribution guidelines

The Go contribution guidelines are thorough on the code review process.

But on design, just this:

"Before undertaking to write something new for the Go project, send mail to the mailing list to discuss what you plan to do."

Does this decribe the project's approach to design? Only superficially.

Successful proposals include design docs
that discuss rationale, tradeoffs, and implementation.

There is a gap in our documented process.


* Go Change Proposal Process: a proposal

Brad Fitzpatrick and I recently proposed a formal Change Proposal Process.

Its goals:

- Make the design process clear to new contributors.
- Commit to timely evaluations of proposals.
- Build a recorded history of proposals.


* How does it work?

The new change process, in brief:

- File an issue.
- The contributors triage the issue.
- Write a design document (following a template).
- The contributors review the document.
- If the proposal is accepted, implement it.

[[https://golang.org/s/proposal-process][golang.org/s/proposal-process]]


* An experimental process

The new process is an experiment.

We're still discussing exactly how it should work.

I hope it will make Go's design process more accessible to the community.


* Conclusion

Go's design-driven process has served us well.

But as Go is more widely used,
the community needs a larger role in shaping its future.

With your help, we can make Go's next 5 years more spectacular than the last.

.image how-go-was-made/5years.png 350 _ 
