| The Path to Go 1 |
| |
| Rob Pike |
| Google |
| https://go.dev |
| |
| Andrew Gerrand |
| Google |
| http://andrewgerrand.com |
| @go_nuts |
| https://go.dev |
| |
| |
| * Introduction |
| |
| Go is a concurrent open source programming language developed at Google. |
| |
| Combines native compilation and static types with a lightweight dynamic feel. |
| |
| Fast, fun, and productive. |
| |
| |
| * What is Go? |
| |
| Features: |
| |
| - Native code generation (compiled) |
| - Statically typed |
| - Composition via interfaces |
| - Memory safe |
| - Garbage collected |
| - Native concurrency support |
| - Excellent standard library |
| - Great tools |
| |
| |
| * History |
| |
| |
| * History |
| |
| Began as a Google 20% project in late 2007. |
| |
| Released as an open source project in November 2009. |
| |
| Go 1 released in March 2012. |
| |
| |
| * The Go project |
| |
| Planned from the start as an open source project. |
| |
| Publicly released under a BSD license. |
| |
| To date: 28 committers from Google and elsewhere. |
| |
| More than 200 other people have contributed to the project. |
| |
| 9735 changes committed since release. |
| |
| |
| * Development process |
| |
| Mercurial version control system with plugin for code review. |
| |
| No branches; linear history. |
| |
| Code review central to the project. All changes reviewed on golang-dev list using Rietveld (codereview.appspot.com). |
| |
| Custom continuous build system tests across all supported platforms. |
| |
| Contributions accepted on a "Discuss first, code later" basis. |
| |
| |
| * Contributions over time |
| |
| The project moves fast: |
| |
| .image go1/changes.png |
| |
| Windows, FreeBSD, OpenBSD, NetBSD, and Plan 9 ports are community-driven. |
| |
| |
| * Managing the project |
| |
| * Development cycle |
| |
| Changes are made continuously. |
| |
| Things break. Things get fixed. |
| Some days are better than others. |
| |
| Continuous builders help, but don't reveal all issues. |
| |
| We needed to provide some stability for our users. |
| |
| |
| * 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. |
| |
| |
| * Problem with releases |
| |
| Easy to make a few small changes once a week... |
| |
| \...but hard to make many small changes once a month. |
| |
| 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. |
| Gofix automates updates for backward-incompatible changes. |
| Eases the burden of staying current. |
| |
| Release notes now mostly say "run gofix." |
| |
| Not a sed script. Works on the AST. |
| |
| |
| * Gofix |
| |
| Gofix enables sweeping changes without fear of breaking the code base. |
| |
| Gofix gave us the freedom to make widespread changes that would have been too daunting otherwise. |
| |
| Can even update foreign code: |
| |
| "Yesterday I gofixed some third-party packages without even reading their code and without waiting for the authors to update them." - Dmitry Chestnykh |
| |
| |
| * 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, even with gofix, some things are too disruptive without proper 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 |
| |
| Wrote a detailed proposal document. |
| |
| Implemented (but not committed) many of the proposed changes. |
| |
| Core team 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 proposal. |
| |
| |
| * Preparing Go 1 |
| |
| |
| Create many new issues on the tracker. |
| |
| Categorize new and existing issues as either "Go 1" or "after Go 1". |
| |
| Contributors nominate themselves to address specific issues. |
| |
| Stop developing new features; prioritize stability. |
| |
| |
| * Rolling it out |
| |
| Daily number of lines changed in the months leading up to Go 1: |
| |
| .image go1/go1lines.png |
| |
| |
| * Gofix and Go 1 |
| |
| The largest Go 1 edits were performed by gofix. |
| |
| Gofix made it easy to try out a change and refine it incrementally. |
| |
| Some significant changes were tried and abandoned. |
| |
| |
| * Gofix work flow |
| |
| Scripted work flow allowed us to avoid branches and merging nightmares. |
| #Total automation of edits makes it easy to do large changes without branching. |
| |
| Process: |
| |
| while !satisfied { |
| in tree 1: |
| refine gofix module in tree 1, build binary |
| in tree 2: |
| revert to tip (note: tip) |
| apply gofix binary from tree 2 |
| build and test |
| } |
| commit tree 1 |
| commit tree 2 |
| |
| Even as other changes are happening, this leads to no branching or skew. |
| |
| * Sample change |
| |
| .image go1/errordiff1.png |
| .image go1/errordiff2.png |
| |
| * Go 1 release process |
| |
| Releases paused from r60 (August 2011). |
| Weeklies continued as normal. |
| |
| Issued release candidates in the weeks leading up to launch. |
| |
| Release candidates included binary distributions for the supported operating systems (FreeBSD, Linux, Mac OS X, and Windows). |
| |
| |
| * What is in Go 1? |
| |
| * Go 1 |
| |
| Specification of the language. |
| |
| Specification of the libraries. |
| |
| Promise of long term compatibility. |
| |
| Windows as a first class citizen. |
| |
| New tool chain centered around the `go` tool. |
| |
| "Phase change" in the way the project runs. |
| |
| |
| * Language changes |
| |
| A new `rune` type to represent a Unicode code point. |
| (Important step in making `int` either 32 or 64 bits; currently just 32.) |
| |
| A new built-in `error` type to replace `os.Error`. |
| This affected almost all Go code in existence. |
| |
| Equality defined on structs. |
| |
| Cleaned up some clumsy operations. |
| |
| |
| * API changes |
| |
| A re-designed `time` package with a clean, simple interface. |
| |
| Regularization of `strconv`, breaking away from the old C-style API. |
| |
| Widespread package re-organization. Put things in more appropriate places. |
| |
| Dozens of lesser changes. |
| |
| |
| * Time |
| |
| Old time package was based on the Unix epoch. Limited range, poor features, |
| no type safety (just integer nanoseconds). |
| |
| Substantial redesign creates separate Time and Duration types. |
| Time can represent huge range of times with nanosecond precision. |
| |
| Duration specifies intervals. Example: |
| |
| time.Sleep(2) // Old API, unsafe: How long is this? |
| time.Sleep(2*time.Second) // New API: type-safe, readable. |
| |
| fmt.Println(time.Now().Add(1e6*time.Hour)) |
| |
| Also a new flag type! |
| |
| $ command -timeout 1m30s |
| |
| * Re-organization |
| |
| Rearranged the organically constructed tree to group related things together. |
| Examples: |
| |
| Old New |
| |
| "asn1" "encoding/asn1" |
| "csv" "encoding/csv" |
| "gob" "encoding/gob" |
| "json" "encoding/json" |
| "xml" "encoding/xml" |
| |
| "unicode" "unicode" |
| "utf8" "unicode/utf8" |
| "utf16" "unicode/utf16" |
| |
| All updated by gofix, of course. |
| |
| * Demoting immature packages and commands |
| |
| Parts of the tree deemed unready should not be part of Go 1. |
| |
| Working but immature packages were moved to sub-repositories of the main Go repository. (They remain installable.) |
| |
| Unfinished and old packages and tools were left out. |
| |
| |
| * How to build |
| |
| Before Go 1, Go programs were built with make, but Makefiles are annoying to write and, for Go, redundant. |
| |
| From the beginning, a goal of Go was good dependency management. |
| |
| By design, Go source code contains all the information necessary to build. |
| |
| Go 1 includes a new "go tool" that eliminates the need for make. |
| |
| Given a Go tree (including remote dependencies), can build and install directly: |
| |
| $ go build file.go |
| |
| * The go tool |
| |
| A complete build, test, and install tool for Go programs. |
| |
| Some realistic examples: |
| |
| $ go run hello.go # Compile-and-go. (Ha!). |
| $ go build package # Build everything in directory (and deps). |
| $ go install # Install everything in dir and (and deps). |
| $ go test archive/zip # Compile and run unit tests for package. |
| |
| The go tool also wraps `gofmt`, `gofix`, etc.: |
| |
| $ go fmt # Run gofmt on package in current dir. |
| $ go fix # Run gofix on package in current dir. |
| |
| * The go tool and remote repositories |
| |
| The go tool automates installation of remote packages. |
| |
| Packages are addressed by import strings. |
| Import strings are just source repository URLs. |
| Go tool downloads and installs all dependencies, transitively. |
| |
| $ go get code.google.com/p/myrepo/mypackage |
| |
| Installs my package, plus any remote dependencies it may have. |
| And to use the package in Go source: |
| |
| import "code.google.com/p/myrepo/mypackage" |
| |
| The tool can even run gofix as it installs: |
| |
| $ go get -fix code.google.com/p/myrepo/mypackage |
| |
| |
| * Documentation |
| |
| Complete reworking: |
| |
| - updated, |
| - unified, |
| - added new documents, |
| - added new (executable) examples, |
| - redesigned web site. |
| |
| |
| * API compatibility tool |
| |
| Scans the entire standard library and checks it against a master list (`go1.txt`). |
| |
| Helps guarantee compatibility as development continues. |
| |
| Part of our build process in the lead up to Go 1 (and continues today). |
| |
| |
| * Today and tomorrow |
| |
| * What are we working on? |
| |
| The goal for Go 1 was a stable, productive environment. |
| |
| Now that Go 1 is out, we are shifting our focus to using Go more than just developing it. |
| |
| Only through using Go extensively can we learn what might be needed in a future version, say Go 2. |
| |
| * There is still active development |
| |
| The design is locked down but work continues. |
| |
| Stability: bug fixes. |
| |
| Efficiency: |
| |
| - code generation, |
| - garbage collection, |
| - scheduling, |
| - hot spots in standard libraries. |
| |
| Portability: NetBSD, OpenBSD, and Plan 9 ports in progress. |
| |
| New libraries: HTML parsing and Unicode collation packages, for example. |
| |
| * Releases after Go 1 |
| |
| Two minor point releases (`go1.0.1` and `go1.0.2`) have been issued to fix bugs. |
| |
| The next major point release (`go1.1`) is planned for the end of 2012. |
| It will include: |
| |
| - code generation improvements to the `gc` compiler, |
| - performance and accuracy improvements to the garbage collector, |
| - (possibly) an improved scheduler, |
| - a slew of bug fixes. |
| |
| Go 2 is likely years away. |
| |
| |
| * Learn more |
| |
| The Go web site has a huge amount of documentation: |
| |
| .link / go.dev |
| |
| Learn Go from a web browser: |
| |
| .link /tour/ go.dev/tour |
| |
| "Meet the Go team" panel from Google I/O 2012: |
| |
| .link /s/meet-the-go-team go.dev/s/meet-the-go-team |
| |
| Google Code project: |
| |
| .link http://code.google.com/p/go |
| |