| # Go, Open Source, Community | |
| 8 Jul 2015 | |
| Tags: community | |
| Summary: Why is Go open source, and how can we strengthen our open-source community? | |
| Russ Cox | |
| ## Welcome | |
| [This is the text of my opening keynote at Gophercon 2015. | |
| [The video is available here](https://www.youtube.com/watch?v=XvZOdpd_9tc).] | |
| Thank you all for traveling to Denver to be here, | |
| and thank you to everyone watching on video. | |
| If this is your first Gophercon, welcome. | |
| If you were here last year, welcome back. | |
| Thank you to the organizers | |
| for all the work it takes | |
| to make a conference like this happen. | |
| I am thrilled to be here and to be able to talk to all of you. | |
| I am the tech lead for the Go project | |
| and the Go team at Google. | |
| I share that role with Rob Pike. | |
| In that role, I spend a lot of time thinking about | |
| the overall Go open source project, | |
| in particular the way it runs, | |
| what it means to be open source, | |
| and the interaction between | |
| contributors inside and outside Google. | |
| Today I want to share with you | |
| how I see the Go project as a whole | |
| and then based on that explain | |
| how I see the Go open source project | |
| evolving. | |
| ## Why Go? | |
| To get started, | |
| we have to go back to the beginning. | |
| Why did we start working on Go? | |
| Go is an attempt to make programmers more productive. | |
| We wanted to improve the software development process | |
| at Google, | |
| but the problems Google has | |
| are not unique to Google. | |
| There were two overarching goals. | |
| The first goal is to make a better language | |
| to meet the challenges of scalable concurrency. | |
| By scalable concurrency I mean | |
| software that deals with many concerns simultaneously, | |
| such as coordinating a thousand back end servers | |
| by sending network traffic back and forth. | |
| Today, that kind of software has a shorter name: | |
| we call it cloud software. | |
| It's fair to say that Go was designed for the cloud | |
| before clouds ran software. | |
| The larger goal is to make a better environment | |
| to meet the challenges of scalable software development, | |
| software worked on and used by many people, | |
| with limited coordination between them, | |
| and maintained for years. | |
| At Google we have thousands of engineers | |
| writing and sharing their code with each other, | |
| trying to get their work done, | |
| reusing the work of others as much as possible, | |
| and working in a code base with a history | |
| dating back over ten years. | |
| Engineers often work on or at least look at | |
| code originally written by someone else, | |
| or that they wrote years ago, | |
| which often amounts to the same thing. | |
| That situation inside Google | |
| has a lot in common with | |
| large scale, modern open source development | |
| as practiced on sites like GitHub. | |
| Because of this, | |
| Go is a great fit for open source projects, | |
| helping them accept and manage | |
| contributions from a large community | |
| over a long period of time. | |
| I believe much of Go's success is explained by the fact that | |
| Go is a great fit for cloud software, | |
| Go is a great fit for open source projects, | |
| and, serendipitously, both of those are | |
| growing in popularity and importance | |
| in the software industry. | |
| Other people have made similar observations. | |
| Here are two. | |
| Last year, on RedMonk.com, Donnie Berkholz | |
| wrote about | |
| “[Go as the emerging language of cloud infrastructure](http://redmonk.com/dberkholz/2014/03/18/go-the-emerging-language-of-cloud-infrastructure/),” | |
| observing that | |
| “[Go's] marquee projects ... are cloud-centric or otherwise | |
| made for dealing with distributed systems | |
| or transient environments.” | |
| This year, on Texlution.com, the author | |
| wrote an article titled | |
| “[Why Golang is doomed to succeed](https://texlution.com/post/why-go-is-doomed-to-succeed/),” | |
| pointing out that this focus on large-scale development | |
| was possibly even better suited to open source than | |
| to Google itself: “This open source fitness is why I think | |
| you are about to see more and more Go around ...” | |
| ## The Go Balance | |
| How does Go accomplish those things? | |
| How does it make scalable concurrency | |
| and scalable software development easier? | |
| Most people answer this question by talking about | |
| channels and goroutines, and interfaces, and fast builds, | |
| and the go command, and good tool support. | |
| Those are all important parts of the answer, | |
| but I think there is a broader idea behind them. | |
| I think of that idea as Go's balance. | |
| There are competing concerns in any software design, | |
| and there is a very natural tendency to try to solve | |
| all the problems you foresee. | |
| In Go, we have explicitly tried not to solve everything. | |
| Instead, we've tried to do just enough that you can build | |
| your own custom solutions easily. | |
| The way I would summarize Go's chosen balance is this: **Do Less. Enable More.** | |
| Do less, but enable more. | |
| Go can't do everything. | |
| We shouldn't try. | |
| But if we work at it, | |
| Go can probably do | |
| a few things well. | |
| If we select those things carefully, | |
| we can lay a foundation | |
| on which developers can _easily_ build | |
| the solutions and tools they need, | |
| and ideally can interoperate with | |
| the solutions and tools built by others. | |
| ### Examples | |
| Let me illustrate this with some examples. | |
| First, the size of the Go language itself. | |
| We worked hard to put in as few concepts as possible, | |
| to avoid the problem of mutually incomprehensible dialects | |
| forming in different parts of a large developer community. | |
| No idea went into Go until | |
| it had been simplified to its essence | |
| and then had clear benefits | |
| that justified the complexity being added. | |
| In general, if we have 100 things | |
| we want Go to do well, | |
| we can't make 100 separate changes. | |
| Instead, we try to research and understand | |
| the design space | |
| and then identify a few changes | |
| that work well together | |
| and that enable maybe 90 of those things. | |
| We're willing to sacrifice the remaining 10 | |
| to avoid bloating the language, | |
| to avoid adding complexity | |
| only to address specific use cases | |
| that seem important today | |
| but might be gone tomorrow. | |
| Keeping the language small | |
| enables more important goals. | |
| Being small makes Go | |
| easier to learn, | |
| easier to understand, | |
| easier to implement, | |
| easier to reimplement, | |
| easier to debug, | |
| easier to adjust, | |
| and easier to evolve. | |
| Doing less enables more. | |
| I should point out that | |
| this means we say no | |
| to a lot of other people's ideas, | |
| but I assure you | |
| we've said no | |
| to even more of our own ideas. | |
| Next, channels and goroutines. | |
| How should we structure and coordinate | |
| concurrent and parallel computations? | |
| Mutexes and condition variables are very general | |
| but so low-level that they're difficult to use correctly. | |
| Parallel execution frameworks like OpenMP are so high-level | |
| that they can only be used to solve a narrow range of problems. | |
| Channels and goroutines sit between these two extremes. | |
| By themselves, they aren't a solution to much. | |
| But they are powerful enough to be easily arranged | |
| to enable solutions to many common problems | |
| in concurrent software. | |
| Doing less—really doing just enough—enables more. | |
| Next, types and interfaces. | |
| Having static types enables useful compile-time checking, | |
| something lacking in dynamically-typed languages | |
| like Python or Ruby. | |
| At the same time, | |
| Go's static typing avoids | |
| much of the repetition | |
| of traditional statically typed languages, | |
| making it feel more lightweight, | |
| more like the dynamically-typed languages. | |
| This was one of the first things people noticed, | |
| and many of Go's early adopters came from | |
| dynamically-typed languages. | |
| Go's interfaces are a key part of that. | |
| In particular, | |
| omitting the ``implements'' declarations | |
| of Java or other languages with static hierarchy | |
| makes interfaces lighter weight and more flexible. | |
| Not having that rigid hierarchy | |
| enables idioms such as test interfaces that describe | |
| existing, unrelated production implementations. | |
| Doing less enables more. | |
| Next, testing and benchmarking. | |
| Is there any shortage of testing | |
| and benchmarking frameworks in most languages? | |
| Is there any agreement between them? | |
| Go's testing package is not meant | |
| to address every possible facet of these topics. | |
| Instead, it is meant to provide | |
| the basic concepts necessary | |
| for most higher-level tooling. | |
| Packages have test cases that pass, fail, or are skipped. | |
| Packages have benchmarks that run and can be measured | |
| by various metrics. | |
| Doing less here is an attempt | |
| to reduce these concepts to their essence, | |
| to create a shared vocabulary | |
| so that richer tools can interoperate. | |
| That agreement enables higher-level testing software | |
| like Miki Tebeka's go2xunit converter, | |
| or the benchcmp and benchstat | |
| benchmark analysis tools. | |
| Because there _is_ agreement | |
| about the representation of the basic concepts, | |
| these higher-level tools work for all Go packages, | |
| not just ones that make the effort to opt in, | |
| and they interoperate with each other, | |
| in that using, say, go2xunit | |
| does not preclude also using benchstat, | |
| the way it would if these tools were, say, | |
| plugins for competing testing frameworks. | |
| Doing less enables more. | |
| Next, refactoring and program analysis. | |
| Because Go is for large code bases, | |
| we knew it would need to support automatic | |
| maintenance and updating of source code. | |
| We also knew that this topic was too large | |
| to build in directly. | |
| But we knew one thing that we had to do. | |
| In our experience attempting | |
| automated program changes in other settings, | |
| the most significant barrier we hit | |
| was actually writing the modified program out | |
| in a format that developers can accept. | |
| In other languages, | |
| it's common for different teams to use | |
| different formatting conventions. | |
| If an edit by a program uses the wrong convention, | |
| it either writes a section of the source file that looks nothing | |
| like the rest of the file, or it reformats the entire file, | |
| causing unnecessary and unwanted diffs. | |
| Go does not have this problem. | |
| We designed the language to make gofmt possible, | |
| we worked hard | |
| to make gofmt's formatting acceptable | |
| for all Go programs, | |
| and we made sure gofmt was there | |
| from day one of the original public release. | |
| Gofmt imposes such uniformity that | |
| automated changes blend into the rest of the file. | |
| You can't tell whether a particular change | |
| was made by a person or a computer. | |
| We didn't build explicit refactoring support. | |
| Establishing an agreed-upon formatting algorithm | |
| was enough of a shared base | |
| for independent tools to develop and to interoperate. | |
| Gofmt enabled gofix, goimports, eg, and other tools. | |
| I believe the work here is only just getting started. | |
| Even more can be done. | |
| Last, building and sharing software. | |
| In the run up to Go 1, we built goinstall, | |
| which became what we all know as "go get". | |
| That tool defined a standard zero-configuration way | |
| to resolve import paths on sites like github.com, | |
| and later a way to resolve paths on other sites | |
| by making HTTP requests. | |
| This agreed-upon resolution algorithm | |
| enabled other tools that work in terms of those paths, | |
| most notably Gary Burd's creation of godoc.org. | |
| In case you haven't used it, | |
| you go to godoc.org/the-import-path | |
| for any valid "go get" import path, | |
| and the web site will fetch the code | |
| and show you the documentation for it. | |
| A nice side effect of this has been that | |
| godoc.org serves as a rough master list | |
| of the Go packages publicly available. | |
| All we did was give import paths a clear meaning. | |
| Do less, enable more. | |
| You'll notice that many of these tooling examples | |
| are about establishing a shared convention. | |
| Sometimes people refer to this as Go being “opinionated,” | |
| but there's something deeper going on. | |
| Agreeing to the limitations | |
| of a shared convention | |
| is a way to enable | |
| a broad class of tools that interoperate, | |
| because they all speak the same base language. | |
| This is a very effective way | |
| to do less but enable more. | |
| Specifically, in many cases | |
| we can do the minimum required | |
| to establish a shared understanding | |
| of a particular concept, like remote imports, | |
| or the proper formatting of a source file, | |
| and thereby enable | |
| the creation of packages and tools | |
| that work together | |
| because they all agree | |
| about those core details. | |
| I'm going to return to that idea later. | |
| ## Why is Go open source? | |
| But first, as I said earlier, | |
| I want to explain how I see | |
| the balance of Do Less and Enable More | |
| guiding our work | |
| on the broader | |
| Go open source project. | |
| To do that, I need to start with | |
| why Go is open source at all. | |
| Google pays me and others to work on Go, because, | |
| if Google's programmers are more productive, | |
| Google can build products faster, | |
| maintain them more easily, | |
| and so on. | |
| But why open source Go? | |
| Why should Google share this benefit with the world? | |
| Of course, many of us | |
| worked on open source projects before Go, | |
| and we naturally wanted Go | |
| to be part of that open source world. | |
| But our preferences are not a business justification. | |
| The business justification is that | |
| Go is open source | |
| because that's the only way | |
| that Go can succeed. | |
| We, the team that built Go within Google, | |
| knew this from day one. | |
| We knew that Go had to be made available | |
| to as many people as possible | |
| for it to succeed. | |
| Closed languages die. | |
| A language needs large, broad communities. | |
| A language needs lots of people writing lots of software, | |
| so that when you need a particular tool or library, | |
| there's a good chance it has already been written, | |
| by someone who knows the topic better than you, | |
| and who spent more time than you have to make it great. | |
| A language needs lots of people reporting bugs, | |
| so that problems are identified and fixed quickly. | |
| Because of the much larger user base, | |
| the Go compilers are much more robust and spec-compliant | |
| than the Plan 9 C compilers they're loosely based on ever were. | |
| A language needs lots of people using it | |
| for lots of different purposes, | |
| so that the language doesn't overfit to one use case | |
| and end up useless when the technology landscape changes. | |
| A language needs lots of people who want to learn it, | |
| so that there is a market for people to write books | |
| or teach courses, | |
| or run conferences like this one. | |
| None of this could have happened | |
| if Go had stayed within Google. | |
| Go would have suffocated inside Google, | |
| or inside any single company | |
| or closed environment. | |
| Fundamentally, | |
| Go must be open, | |
| and Go needs you. | |
| Go can't succeed without all of you, | |
| without all the people using Go | |
| for all different kinds of projects | |
| all over the world. | |
| In turn, the Go team at Google | |
| could never be large enough | |
| to support the entire Go community. | |
| To keep scaling, | |
| we | |
| need to enable all this ``more'' | |
| while doing less. | |
| Open source is a huge part of that. | |
| ## Go's open source | |
| What does open source mean? | |
| The minimum requirement is to open the source code, | |
| making it available under an open source license, | |
| and we've done that. | |
| But we also opened our development process: | |
| since announcing Go, | |
| we've done all our development in public, | |
| on public mailing lists open to all. | |
| We accept and review | |
| source code contributions from anyone. | |
| The process is the same | |
| whether you work for Google or not. | |
| We maintain our bug tracker in public, | |
| we discuss and develop proposals for changes in public, | |
| and we work toward releases in public. | |
| The public source tree is the authoritative copy. | |
| Changes happen there first. | |
| They are only brought into | |
| Google's internal source tree later. | |
| For Go, being open source means | |
| that this is a collective effort | |
| that extends beyond Google, open to all. | |
| Any open source project starts with a few people, | |
| often just one, but with Go it was three: | |
| Robert Griesemer, Rob Pike, and Ken Thompson. | |
| They had a vision of | |
| what they wanted Go to be, | |
| what they thought Go could do better | |
| than existing languages, and | |
| Robert will talk more about that tomorrow morning. | |
| I was the next person to join the team, | |
| and then Ian Taylor, | |
| and then, one by one, | |
| we've ended up where we are today, | |
| with hundreds of contributors. | |
| Thank You | |
| to the many people who have contributed | |
| code | |
| or ideas | |
| or bug reports | |
| to the Go project so far. | |
| We tried to list everyone we could | |
| in our space in the program today. | |
| If your name is not there, | |
| I apologize, | |
| but thank you. | |
| I believe | |
| the hundreds of contributors so far | |
| are working toward a shared vision | |
| of what Go can be. | |
| It's hard to put words to these things, | |
| but I did my best | |
| to explain one part of the vision | |
| earlier: | |
| Do Less, Enable More. | |
| ## Google's role | |
| A natural question is: | |
| What is the role | |
| of the Go team at Google, | |
| compared to other contributors? | |
| I believe that role | |
| has changed over time, | |
| and it continues to change. | |
| The general trend is that | |
| over time | |
| the Go team at Google | |
| should be doing less | |
| and enabling more. | |
| In the very early days, | |
| before Go was known to the public, | |
| the Go team at Google | |
| was obviously working by itself. | |
| We wrote the first draft of everything: | |
| the specification, | |
| the compiler, | |
| the runtime, | |
| the standard library. | |
| Once Go was open sourced, though, | |
| our role began to change. | |
| The most important thing | |
| we needed to do | |
| was communicate our vision for Go. | |
| That's difficult, | |
| and we're still working at it.. | |
| The initial implementation | |
| was an important way | |
| to communicate that vision, | |
| as was the development work we led | |
| that resulted in Go 1, | |
| and the various blog posts, | |
| and articles, | |
| and talks we've published. | |
| But as Rob said at Gophercon last year, | |
| "the language is done." | |
| Now we need to see how it works, | |
| to see how people use it, | |
| to see what people build. | |
| The focus now is on | |
| expanding the kind of work | |
| that Go can help with. | |
| Google's primarily role is now | |
| to enable the community, | |
| to coordinate, | |
| to make sure changes work well together, | |
| and to keep Go true to the original vision. | |
| Google's primary role is: | |
| Do Less. Enable More. | |
| I mentioned earlier | |
| that we'd rather have a small number of features | |
| that enable, say, 90% of the target use cases, | |
| and avoid the orders of magnitude | |
| more features necessary | |
| to reach 99 or 100%. | |
| We've been successful in applying that strategy | |
| to the areas of software that we know well. | |
| But if Go is to become useful in many new domains, | |
| we need experts in those areas | |
| to bring their expertise | |
| to our discussions, | |
| so that together | |
| we can design small adjustments | |
| that enable many new applications for Go. | |
| This shift applies not just to design | |
| but also to development. | |
| The role of the Go team at Google | |
| continues to shift | |
| more to one of guidance | |
| and less of pure development. | |
| I certainly spend much more time | |
| doing code reviews than writing code, | |
| more time processing bug reports | |
| than filing bug reports myself. | |
| We need to do less and enable more. | |
| As design and development shift | |
| to the broader Go community, | |
| one of the most important things | |
| we | |
| the original authors of Go | |
| can offer | |
| is consistency of vision, | |
| to help keep Go | |
| Go. | |
| The balance that we must strike | |
| is certainly subjective. | |
| For example, a mechanism for extensible syntax | |
| would be a way to | |
| enable more | |
| ways to write Go code, | |
| but that would run counter to our goal | |
| of having a consistent language | |
| without different dialects. | |
| We have to say no sometimes, | |
| perhaps more than in other language communities, | |
| but when we do, | |
| we aim to do so | |
| constructively and respectfully, | |
| to take that as an opportunity | |
| to clarify the vision for Go. | |
| Of course, it's not all coordination and vision. | |
| Google still funds Go development work. | |
| Rick Hudson is going to talk later today | |
| about his work on reducing garbage collector latency, | |
| and Hana Kim is going to talk tomorrow | |
| about her work on bringing Go to mobile devices. | |
| But I want to make clear that, | |
| as much as possible, | |
| we aim to treat | |
| development funded by Google | |
| as equal to | |
| development funded by other companies | |
| or contributed by individuals using their spare time. | |
| We do this because we don't know | |
| where the next great idea will come from. | |
| Everyone contributing to Go | |
| should have the opportunity to be heard. | |
| ### Examples | |
| I want to share some evidence for this claim | |
| that, over time, | |
| the original Go team at Google | |
| is focusing more on | |
| coordination than direct development. | |
| First, the sources of funding | |
| for Go development are expanding. | |
| Before the open source release, | |
| obviously Google paid for all Go development. | |
| After the open source release, | |
| many individuals started contributing their time, | |
| and we've slowly but steadily | |
| been growing the number of contributors | |
| supported by other companies | |
| to work on Go at least part-time, | |
| especially as it relates to | |
| making Go more useful for those companies. | |
| Today, that list includes | |
| Canonical, Dropbox, Intel, Oracle, and others. | |
| And of course Gophercon and the other | |
| regional Go conferences are organized | |
| entirely by people outside Google, | |
| and they have many corporate sponsors | |
| besides Google. | |
| Second, the conceptual depth | |
| of Go development | |
| done outside the original team | |
| is expanding. | |
| Immediately after the open source release, | |
| one of the first large contributions | |
| was the port to Microsoft Windows, | |
| started by Hector Chu | |
| and completed by Alex Brainman and others. | |
| More contributors ported Go | |
| to other operating systems. | |
| Even more contributors | |
| rewrote most of our numeric code | |
| to be faster or more precise or both. | |
| These were all important contributions, | |
| and very much appreciated, | |
| but | |
| for the most part | |
| they did not involve new designs. | |
| More recently, | |
| a group of contributors led by Aram Hăvărneanu | |
| ported Go to the ARM 64 architecture, | |
| This was the first architecture port | |
| by contributors outside Google. | |
| This is significant, because | |
| in general | |
| support for a new architecture | |
| requires more design work | |
| than support for a new operating system. | |
| There is more variation between architectures | |
| than between operating systems. | |
| Another example is the introduction | |
| over the past few releases | |
| of preliminary support | |
| for building Go programs using shared libraries. | |
| This feature is important for many Linux distributions | |
| but not as important for Google, | |
| because we deploy static binaries. | |
| We have been helping guide the overall strategy, | |
| but most of the design | |
| and nearly all of the implementation | |
| has been done by contributors outside Google, | |
| especially Michael Hudson-Doyle. | |
| My last example is the go command's | |
| approach to vendoring. | |
| I define vendoring as | |
| copying source code for external dependencies | |
| into your tree | |
| to make sure that they doesn't disappear | |
| or change underfoot. | |
| Vendoring is not a problem Google suffers, | |
| at least not the way the rest of the world does. | |
| We copy open source libraries we want to use | |
| into our shared source tree, | |
| record what version we copied, | |
| and only update the copy | |
| when there is a need to do so. | |
| We have a rule | |
| that there can only be one version | |
| of a particular library in the source tree, | |
| and it's the job of whoever wants to upgrade that library | |
| to make sure it keeps working as expected | |
| by the Google code that depends on it. | |
| None of this happens often. | |
| This is the lazy approach to vendoring. | |
| In contrast, most projects outside Google | |
| take a more eager approach, | |
| importing and updating code | |
| using automated tools | |
| and making sure that they are | |
| always using the latest versions. | |
| Because Google has relatively little experience | |
| with this vendoring problem, | |
| we left it to users outside Google to develop solutions. | |
| Over the past five years, | |
| people have built a series of tools. | |
| The main ones in use today are | |
| Keith Rarick's godep, | |
| Owen Ou's nut, | |
| and the gb-vendor plugin for Dave Cheney's gb, | |
| There are two problems with the current situation. | |
| The first is that these tools | |
| are not compatible | |
| out of the box | |
| with the go command's "go get". | |
| The second is that the tools | |
| are not even compatible with each other. | |
| Both of these problems | |
| fragment the developer community by tool. | |
| Last fall, we started a public design discussion | |
| to try to build consensus on | |
| some basics about | |
| how these tools all operate, | |
| so that they can work alongside "go get" | |
| and each other. | |
| Our basic proposal was that all tools agree | |
| on the approach of rewriting import paths during vendoring, | |
| to fit with "go get"'s model, | |
| and also that all tools agree on a file format | |
| describing the source and version of the copied code, | |
| so that the different vendoring tools | |
| can be used together | |
| even by a single project. | |
| If you use one today, | |
| you should still be able to use another tomorrow. | |
| Finding common ground in this way | |
| was very much in the spirit of Do Less, Enable More. | |
| If we could build consensus | |
| about these basic semantic aspects, | |
| that would enable "go get" and all these tools to interoperate, | |
| and it would enable switching between tools, | |
| the same way that | |
| agreement about how Go programs | |
| are stored in text files | |
| enables the Go compiler and all text editors to interoperate. | |
| So we sent out our proposal for common ground. | |
| Two things happened. | |
| First, Daniel Theophanes | |
| started a vendor-spec project on GitHub | |
| with a new proposal | |
| and took over coordination and design | |
| of the spec for vendoring metadata. | |
| Second, the community spoke | |
| with essentially one voice | |
| to say that | |
| rewriting import paths during vendoring | |
| was not tenable. | |
| Vendoring works much more smoothly | |
| if code can be copied without changes. | |
| Keith Rarick posted an alternate proposal | |
| for a minimal change to the go command | |
| to support vendoring without rewriting import paths. | |
| Keith's proposal was configuration-free | |
| and fit in well with the rest of the go command's approach. | |
| That proposal will ship | |
| as an experimental feature in Go 1.5 | |
| and likely enabled by default in Go 1.6. | |
| And I believe that the various vendoring tool authors | |
| have agreed to adopt Daniel's spec once it is finalized. | |
| The result | |
| is that at the next Gophercon | |
| we should have broad interoperability | |
| between vendoring tools and the go command, | |
| and the design to make that happen | |
| was done entirely by contributors | |
| outside the original Go team. | |
| Not only that, | |
| the Go team's proposal for how to do this | |
| was essentially completely wrong. | |
| The Go community told us that | |
| very clearly. | |
| We took that advice, | |
| and now there's a plan for vendoring support | |
| that I believe | |
| everyone involved is happy with. | |
| This is also a good example | |
| of our general approach to design. | |
| We try not to make any changes to Go | |
| until we feel there is broad consensus | |
| on a well-understood solution. | |
| For vendoring, | |
| feedback and design | |
| from the Go community | |
| was critical to reaching that point. | |
| This general trend | |
| toward both code and design | |
| coming from the broader Go community | |
| is important for Go. | |
| You, the broader Go community, | |
| know what is working | |
| and what is not | |
| in the environments where you use Go. | |
| We at Google don't. | |
| More and more, | |
| we will rely on your expertise, | |
| and we will try to help you develop | |
| designs and code | |
| that extend Go to be useful in more settings | |
| and fit well with Go's original vision. | |
| At the same time, | |
| we will continue to wait | |
| for broad consensus | |
| on well-understood solutions. | |
| This brings me to my last point. | |
| ## Code of Conduct | |
| I've argued that Go must be open, | |
| and that Go needs your help. | |
| But in fact Go needs everyone's help. | |
| And everyone isn't here. | |
| Go needs ideas from as many people as possible. | |
| To make that a reality, | |
| the Go community needs to be | |
| as inclusive, | |
| welcoming, | |
| helpful, | |
| and respectful as possible. | |
| The Go community is large enough now that, | |
| instead of assuming that everyone involved | |
| knows what is expected, | |
| I and others believe that it makes sense | |
| to write down those expectations explicitly. | |
| Much like the Go spec | |
| sets expectations for all Go compilers, | |
| we can write a spec | |
| setting expectations for our behavior | |
| in online discussions | |
| and in offline meetings like this one. | |
| Like any good spec, | |
| it must be general enough | |
| to allow many implementations | |
| but specific enough | |
| that it can identify important problems. | |
| When our behavior doesn't meet the spec, | |
| people can point that out to us, | |
| and we can fix the problem. | |
| At the same time, | |
| it's important to understand that | |
| this kind of spec | |
| cannot be as precise as a language spec. | |
| We must start with the assumption | |
| that we will all be reasonable in applying it. | |
| This kind of spec | |
| is often referred to as | |
| a Code of Conduct. | |
| Gophercon has one, | |
| which we've all agreed to follow | |
| by being here, | |
| but the Go community does not. | |
| I and others | |
| believe the Go community | |
| needs a Code of Conduct. | |
| But what should it say? | |
| I believe | |
| the most important | |
| overall statement we can make | |
| is that | |
| if you want to use or discuss Go, | |
| then you are welcome here, | |
| in our community. | |
| That is the standard | |
| I believe we aspire to. | |
| If for no other reason | |
| (and, to be clear, there are excellent other reasons), | |
| Go needs as large a community as possible. | |
| To the extent that behavior | |
| limits the size of the community, | |
| it holds Go back. | |
| And behavior can easily | |
| limit the size of the community. | |
| The tech community in general | |
| and the Go community in particular | |
| is skewed toward people who communicate bluntly. | |
| I don't believe this is fundamental. | |
| I don't believe this is necessary. | |
| But it's especially easy to do | |
| in online discussions like email and IRC, | |
| where plain text is not supplemented | |
| by the other cues and signals we have | |
| in face-to-face interactions. | |
| For example, I have learned | |
| that when I am pressed for time | |
| I tend to write fewer words, | |
| with the end result that | |
| my emails seem not just hurried | |
| but blunt, impatient, even dismissive. | |
| That's not how I feel, | |
| but it's how I can come across, | |
| and that impression can be enough | |
| to make people think twice | |
| about using or contributing | |
| to Go. | |
| I realized I was doing this | |
| when some Go contributors | |
| sent me private email to let me know. | |
| Now, when I am pressed for time, | |
| I pay extra attention to what I'm writing, | |
| and I often write more than I naturally would, | |
| to make sure | |
| I'm sending the message I intend. | |
| I believe | |
| that correcting the parts | |
| of our everyday interactions, | |
| intended or not, | |
| that drive away potential users and contributors | |
| is one of the most important things | |
| we can all do | |
| to make sure the Go community | |
| continues to grow. | |
| A good Code of Conduct can help us do that. | |
| We have no experience writing a Code of Conduct, | |
| so we have been reading existing ones, | |
| and we will probably adopt an existing one, | |
| perhaps with minor adjustments. | |
| The one I like the most is the Django Code of Conduct, | |
| which originated with another project called SpeakUp! | |
| It is structured as an elaboration of a list of | |
| reminders for everyday interaction. | |
| "Be friendly and patient. | |
| Be welcoming. | |
| Be considerate. | |
| Be respectful. | |
| Be careful in the words that you choose. | |
| When we disagree, try to understand why." | |
| I believe this captures the tone we want to set, | |
| the message we want to send, | |
| the environment we want to create | |
| for new contributors. | |
| I certainly want to be | |
| friendly, | |
| patient, | |
| welcoming, | |
| considerate, | |
| and respectful. | |
| I won't get it exactly right all the time, | |
| and I would welcome a helpful note | |
| if I'm not living up to that. | |
| I believe most of us | |
| feel the same way. | |
| I haven't mentioned | |
| active exclusion based on | |
| or disproportionately affecting | |
| race, gender, disability, | |
| or other personal characteristics, | |
| and I haven't mentioned harassment. | |
| For me, | |
| it follows from what I just said | |
| that exclusionary behavior | |
| or explicit harassment | |
| is absolutely unacceptable, | |
| online and offline. | |
| Every Code of Conduct says this explicitly, | |
| and I expect that ours will too. | |
| But I believe the SpeakUp! reminders | |
| about everyday interactions | |
| are an equally important statement. | |
| I believe that | |
| setting a high standard | |
| for those everyday interactions | |
| makes extreme behavior | |
| that much clearer | |
| and easier to deal with. | |
| I have no doubts that | |
| the Go community can be | |
| one of the most | |
| friendly, | |
| welcoming, | |
| considerate, | |
| and | |
| respectful communities | |
| in the tech industry. | |
| We can make that happen, | |
| and it will be | |
| a benefit and credit to us all. | |
| Andrew Gerrand | |
| has been leading the effort | |
| to adopt an appropriate Code of Conduct | |
| for the Go community. | |
| If you have suggestions, | |
| or concerns, | |
| or experience with Codes of Conduct, | |
| or want to be involved, | |
| please find Andrew or me | |
| during the conference. | |
| If you'll still be here on Friday, | |
| Andrew and I are going to block off | |
| some time for Code of Conduct discussions | |
| during Hack Day. | |
| Again, we don't know | |
| where the next great idea will come from. | |
| We need all the help we can get. | |
| We need a large, diverse Go community. | |
| ## Thank You | |
| I consider the many people | |
| releasing software for download using “go get,” | |
| sharing their insights via blog posts, | |
| or helping others on the mailing lists or IRC | |
| to be part of this broad open source effort, | |
| part of the Go community. | |
| Everyone here today is also part of that community. | |
| Thank you in advance | |
| to the presenters | |
| who over the next few days | |
| will take time to share their experiences | |
| using and extending Go. | |
| Thank you in advance | |
| to all of you in the audience | |
| for taking the time to be here, | |
| to ask questions, | |
| and to let us know | |
| how Go is working for you. | |
| When you go back home, | |
| please continue to share what you've learned. | |
| Even if you don't use Go | |
| for daily work, | |
| we'd love to see what's working for Go | |
| adopted in other contexts, | |
| just as we're always looking for good ideas | |
| to bring back into Go. | |
| Thank you all again | |
| for making the effort to be here | |
| and for being part of the Go community. | |
| For the next few days, please: | |
| tell us what we're doing right, | |
| tell us what we're doing wrong, | |
| and help us all work together | |
| to make Go even better. | |
| Remember to | |
| be friendly, | |
| patient, | |
| welcoming, | |
| considerate, | |
| and respectful. | |
| Above all, enjoy the conference. |