Dave: 我目前住在澳大利亚,拜访过很多亚洲地区的 Go 语言社区,我的目标是拜访所有亚洲地区的 Go 语言社区:印度,马来西亚,新加坡,中国、日本、韩国等等。我想了解在这里大家是如何理解和使用 Go 语言的。作为一个说英语的西方人,我不太会中文。但在这里我发现一个很显著的现象是开发者们乐于分享和交流,通过线上的微信群和线下的会议、meetup,大家在一起互相交流学习 Go 语言,这是一件很棒的事情。这里分享和相互学习的氛围非常浓厚,我也很喜欢这样的氛围。
Dave: 现在确实有很多各种各样的编程语言,各自有不同的特点。对于 Go 语言来说,我认为它主要有以下三个特点:
简洁。Go 语言的简洁性不是像给小孩的玩具那样,而是它的复杂性不高,非常简洁明了。所以对那些不想使用很复杂的开发者来说,Go 语言是个不错的选择。
聚焦于特定的性能。Go 语言最开始是由谷歌的团队构建,用于编写服务端应用。我们很幸运,现在的技术潮流转向了微服务、Serverless、在云端运行应用程序,这些市场都很适合 Go 语言。可以说是 Go 语言成就了这样的趋势,或者 Go 语言和这种趋势是相互成就的,总之,Go 语言可以解决现在的工程师所面临的问题,比如 Go 语言高并发的特性就很受欢迎。
开发者的生产力。绝大多数的软件开发者不是独自工作,而是在一个公司和一个团队一起工作。所以问题不在于这个项目对于个人来说有多难,而是对于一个公司,产品、项目是否可以长期持续演进维护,对于团队新人,是否会觉得已有代码难以理解。Go 语言的一致性可以避免这些问题,它的代码形式有限,学习起来相对容易,一个开发者在接手一个 Go 语言项目的时候也不会因为看不懂注释而感到挫败。
Dave: 我是 Go 语言开源社区的一名贡献者,但是我不在 Go 语言团队。关于 Go 2 有两件事:
大家都很关心 Go 2,我们不想出现大版本不兼容以前版本的问题。Go 2 更多的是一种理念(Idea),从 Go 1 到 Go 2 是一个不断演进的过程,去年我参加 QCon 的时候,我表达了这样的观点:想一想我们一年当中的日期,从 2019 年 12 月 31 号到 2020 年 1 月 1 日,我们认为是新的一年,但实际上只是向后走了一天而已,对于 Go 语言的版本也是一样,虽然 Go 2.0 对于 1.x 是一个大版本的变迁,但是所有功能都是在不断递进的,不存在特别大的变动。最近在做的事情就是兼容前期版本。
Go 语言团队的做法是把所有的开发文档都公开,社区成员都可以跟进,第一时间试用并给出反馈。这些功能一旦就绪就可以发布,没有固定的时间规划,比如依赖管理等 module 本应是 Go 2 的功能,但是最近的版本却提前发布了这个功能。Go 1.13 将在 7、8 月份的时候发布,会比以前的版本要好。其他的功能还有:error handling, 将在 1.13 版本或者更后期的版本体现。最后一个大的功能是 Generics (泛型)。Generics 早就提上开发日程了,但是我不是很了解 Generics 的进展,我邀请了工程师在几个月以后的 GopherCon 上分享一下进度。
Dave: 这是一个好问题。我们知道 Go 语言是由 Google 的团队构建的。Google 没有公开谈论过他们的 Go 语言团队有多少人。就我所知,在 Golang 的开源项目邮件列表里有几千个名字。就社区来说,2 年前大概有 700 多个个人贡献者,IBM、Intel、Amazon、Fastly、Cloudflare 等使用 Go 语言的公司都有工程师贡献,这一点从邮件地址可以看出来。
Dave:Go 语言的开发周期是 6 个月。通常这个周期分为 3 个月的开发时间和 3 个月的打磨、准备发布时间。在每个开发周期启动之前,都有公开邮件询问大家想在新版本中添加的功能,或大家的计划和想法。此外也有一个正式的 Proposal 的流程,大家可以提出申请,说明想进行一些什么样的更新。这时候你需要提出一个非常详细的设计方案,因为 Go 语言已经有了 10 多年的历史,在提出一个提议的时候需要考虑到之前的一些特性和功能。然后所有的社区成员都会过一遍这个提议。对于小的 bug 报告,直接走 issue track 的流程,GitHub 上也有人专门管理这些 issue,确定这些 bug 的重要性和优先级。
除了 Design Proposal,Go 语言其实没有明确的 roadmap。Design Proposal 随时都可以提出来并开始实施。很幸运我们有来自 Google 的工程师帮助我们进行 Go 语言的开发,但是他们也很清楚 Go 语言并不是 Google 的一个产品,对于 IBM,Amazon 的贡献者来说也是这样。所以 Go 语言没有类似公司发展路线这样的说法,我们也没有一个专门的 Go 语言会议来讲述 Go 语言的 roadmap。Go 语言最关心的是兼容的问题,10 年前的 Go 语言和现在的 Go 也能兼容,大家对于升级不需要有任何担心,升级不会破坏现有的代码。我们一直坚持保留这样的特性。
Dave:Go 语言确实有一些很不错的特性。很多云原生的工具也是 Go 语言写的,比如 5 年前 Docker 就是 Go 语言写的。我认为 Go 语言现在成功的原因在于,它只有一个简单的编译二进制文件。不像 Python 或者 Java 项目,你还需要 Java runtime,或者你需要很多 Python 库,要装很多 Python 版本。只要你编译了 Go 项目,就可以在服务器上运行。这在 5 年前是具有革命性的,因为这样意味着部署应用可以变得更简单,你可以用一个 Go 项目去部署需要大的 runtime 的复杂应用。Docker 和 Kubernetes 是大家最熟悉的,它们都是 Go 语言写的。
Dave: 我不倾向于把 Go 和 Java 看作是一场竞争:只有一种语言是赢家,其余的都是输家。对于编写软件这件事情来说,企业需要开发者帮忙写软件,其目的在于通过软件来交付他们的服务,让生意更好做。企业关心的是写好软件需要多久的时间,能不能找到人来维护软件,如果市场上找不到合适的人才,企业是不是能够培训工程师来做这些。Go 语言现在已经能满足企业的这些要求。
至于 Go 是否会取代 Java,老实说我不知道。毕竟 Java 已经有 20 几年的历史,很多用 Java 的公司在 Java 上做了很多投资,没有必要换一种语言。前边我说过他们之间不是竞争关系,对于企业来说,更多的语言意味着有更多的工具可以选择。Go 语言在服务端很好用,但是在移动手机端还没有涉足。如果你想写一个移动应用程序,你会用 Kotlin,Swift 和 Objective-C,但肯定不会用 Go 语言来写。所以 Go 语言只是企业可以选择的一个工具。这里面的重点在于,企业使用某语言是否方便找到相关的开发者,以及用这种语言写程序是否可靠。
Dave:Go 语言缺乏函数式编程的概念。我认为这是一种客观的抱怨。大家在抱怨这一点是时候其实在说,Go 语言有两个方面不太好用:
泛型,比如一些特定的返回值类型等等。
第二点 Go 语言没有 mutability(可变类型)。
无法通过 Go 来编写函数式编程的代码,并不意味着它不如 Clojure, F# 那么简洁,函数编程不是看有没有 runtime,是不是有垃圾回收器,对于开发者来说这里面是需要权衡取舍的,每种编程语言都有自己的特点,选择谁不选择谁,不代表他们的优劣。
Dave: 对我个人来说,肯定是达到我的预期了,Go 语言给我的生活带来了很大的转变。10 年前我并不是一个软件开发者,是 Go 语言让我成为了一名开发者,改变了我的事业。在这期间,我学会了很多技能:我在 2014 年才开始我的第一次 presentation。如果你想组织一些 meetup,想跟其他人交流,你自己首先要成为一个 talker。十年前我肯定想不到今天我会到处拜访社区,在会议上给几千人做演讲。所以 Go 语言给我自己带来了很大的转变。当 Go 语言发布的时候,大家的想法是想让它保持简单,十多年过去了,Go 语言依然保持简洁性,可读性和强大的生产力,这是很棒的事情。
Dave: 如果要对 Go 语言或者 Go 语言社区做一个总结,我觉得最合适的词就是”成功“。不管是 Go 语言的成长、发展还是使用,Go 语言的用户对它都很满意。我得提一句,人们总是在抱怨,对每一种编程语言都有不满意的地方。但是,如果大家希望有一种语言简单易用又能提高开发者的生产力,那么 Go 语言就是这样的一种编程语言。而且,过去十年已经证明了它确实很成功。
Go 语言的发展也是很成功的。虽然我们也从 Google 的赞助中得到了很多帮助,但他们并不是项目的主要贡献者。大家可以看看有关贡献者的统计,就会发现现在社区的贡献者已经有好几千人了。更重要的是他们不只在做一些改拼写之类的简单工作,他们是真正的编译器贡献者,在过去三四年中对编译器进行了全面重写。普通参与者们做出的实质性贡献完全不亚于 Google 的工程师。而这也恰恰证明了开源的力量,它赋予了参与者们权力,这也是我们决定重写 Go 语言编译器的原因之一:为更多的参与者赋能,保证他们不必非得学习这种 C 语言的奇怪变体。大家不仅能够以使用 Go 语言的方式参与贡献,同时也能接触到最复杂的 Go 语言编译器中,这是巨大的成功。在我看来,无论是 Go 语言本身还是 Go 技术社区,都可以用“成功”来形容。
Dave: 站在个人贡献者的角度来说,我看到的 Go 语言发展中最大的挑战来自于语言和文化的差异。自然语言资源的问题十年前就存在了,今天仍然是我们要面对的挑战。如果一种编程语言要在中国、德国发展得好,就需要有当地自然语言的相关资源。这是第一个挑战:翻译,文档编写。
第二是组织 meetup 的挑战。不同的人有不同的学习方式。有的人习惯于从书本学习,有的人习惯于从视频学习,有的人习惯于和别人呆在一起学习。所以在一个公司或者一定区域去组织 meetup 或者一定规模的会议对很多人来说是很好的学习方式。但是并不是所有人都能到处参会拜访社区,所以我们的一些 meetup 或会议的资源要进行分享。
最后一点的挑战我认为已经在开始改善了。那就是,作为一个 Go 语言开发者,你能找到工作吗?如果你想要放弃以前所做的事情转向别的行业或使用别的工具,其中有很大的风险,比如从 Python 转到 Go。这是所有新事物或新语言面临的问题。现在,对于 Go 语言来说,这个问题已经改善了很多。过去 5 年我到处参会布道,每个国家市场对 Go 语言开发者的需求越来越大了,Go 语言已经从一项爱好变成了公司会进行技术投资的语言。
Dave: 前边我提到过,Go 语言在移动手机端还没有什么作为。对于移动开发,Kotlin 和 Java 用于安卓,只有 Swift 用于 iOS,它们是非常大的平台,但是不如我们想象得那么开放。Go 对手机端很有想法,但是我不确定我们是否能在上面有很大的投资能力,想象一下 Apple 对于 Swift 的投资力度。
Go 语言在服务端,电脑端做的还不错,现在对单片机、IoT 设备我们也在尝试使用 Go。目前已经有了可用于机器人、无人机的 Gobot 框架。还有 TinyGo,一种 Go 编译器,可以用于编写小型的 Go 项目。它并不能和 Go 100% 的兼容,但是它确实已经写成了一个可用于小型单片机的项目。能够让别人理解 Go,还能用于不同的设备,这让人很激动。
最后是在 Web 端前端的应用。我不是 Web 开发人员,我不是太懂,但是我们可以用 WebAssembly 写 Go 项目,并在浏览器中呈现。去年我看过一些非常棒的 3D Demo,既可以在台式机上运行,也可以在浏览器中运行。Go 的发展不仅局限于服务端应用,还可以脱离 JavaScript,编写前端的代码,呈现给用户。
Dave: 继续做你们正在做的事情吧。在中国我发现开发者们非常乐于分享知识,像是书籍、资源的翻译等。我知道的他们有微信群每天都会在里面分享文章和其他资源,让资源变得容易获取。你们做的很好,继续做下去吧。Go 语言在中国发展得也很成功,可以解决问题。像阿里、腾讯、滴滴都在用 Go 语言写后端应用,并且已经取得了不错的效果。
Dave: 我个人感觉不是很正面。这也是我来到亚洲的原因。因为东西方有语言有屏障,交流不是很方便。事实是,Go 语言是用英语完成的,这对于中国以及其他非英语开发者来说都是一个阻碍。目前我也没有很好的办法能解决这个问题,但是我尽量让自己在他们有需要的时候可以帮助他们,比如去年我就帮助别人进行了 issue report。
虽然 Go 语言社区的发展已经很成功了,但是还是有这样的问题:德国的开发者和德国的开发者在一起工作学习,印度的和印度的在一起,中国的和中国的在一起。我不知道如何更好地将这些社区融合,这是一个比编程项目更难的问题。我能想到的最好的办法是,当 GopherCon 等类似的会议上有录像时,可以把这些录像分享出来。至少在中国,我们知道有一些人在翻译 Go 语言相关的资料和文章,虽然不是所有人都能做翻译工作,但是这些存在的资源是可以被引进的。至于不同国家的社区如何融合,不能把它叫做问题,而是存在的挑战。
Go 语言在中国的火热程度甚至超过它的发明者们的想象。国内如七牛、阿里等公司都已经开始大规模使用 Go 语言开发其云计算相关产品。在使用 Go 语言的过程中,会遇到哪些利与弊的问题呢?你可以在 InfoQ 公众号对话框回复关键词:利弊,获取相关分析文章。
请在 InfoQ 公众号对话框回复关键词,留言区回复无法接收的哟!
点个在看少个 bug
1、头条易读遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2、本文内容来自“InfoQ”微信公众号,文章版权归InfoQ公众号所有。