Java 是我这一代人的 COBOL,而 Go 是它的继任者(以及 GopherCon 之后的其他思考)
作者:Paul Dix / 用例
2014 年 4 月 30 日
导航至
上周我参加了在丹佛举行的 GopherCon,这是首届 Golang 大会。会议上有关于 Go 和各种项目的精彩演讲,但对我而言,会议最令人兴奋的事情是结识了这个新兴开发者社区中充满热情的人们。我从这次活动中感受到,我们正处在一个重大浪潮的开端。开发者语言使用方面的一次巨大转变,我认为自从 Java 出现以来我们还没有见过这样的转变。Go 的简洁性、性能、并发原语、强大的实现和易于部署使其成为服务器端代码、Web API 以及更多潜在应用的理想选择,这就是为什么我认为它有可能最终取代 Java。
我的预测比说 Go 会像 Ruby、Python 或 Node 那样流行要强得多。我认为这种情况很可能在几年内发生。虽然它可能不如动态语言那样富有表现力,但我认为它的优势将鼓励许多程序员从动态语言迁移到 Go。有趣的是,我在会议上遇到并认识了许多 Ruby 开发者。动态语言的“难民”是第一批采用者。
然而,说 Go 会像 Java 那样流行,与说 Go 会达到动态语言的流行程度相比,差距还是很大的。Java 可能呈下降趋势,但 Go 甚至在 Y 轴上都看不到踪影,而 Ruby 也只是勉强可见。Go 必须比 Ruby 流行的数量级更高,才能接近 Java 的流行程度。
我为什么要在意流行度呢?因为流行度意味着更多的工作机会、更多的潜在雇员以及更多的工具和库。任何关心自己在市场上的需求(和薪资潜力)的开发者以及任何希望招聘的雇主都应该在选择语言时考虑语言的生命周期。我确信现在仍然有 COBOL 程序员,但如果我在找工作,我不会想成为他们中的一员,如果我是雇主,我也不想找到一位有能力的 COBOL 程序员或任何想学习的人。
让我们单独看看 Go 的流行度。最初的峰值是 Google 的公告,但在右侧是一条开始变得有趣的曲线的开端。会议上的演讲中还有更多图表显示,在过去的几个月中,Go 的普及率几乎呈垂直上升趋势。
如果我是一名风险投资家,并且可以购买 Go 语言的期权,我会认真考虑。由于 Go 只是一种语言,他们将不得不另寻他处:那些将技术押注在 Go 上的公司、用 Go 编写的开源项目、开发者工具以及基础设施和托管。会议上有很多这样的公司和项目。我遇到并交谈过的一些更有趣的公司包括 Cloudflare、Hashicorp、CoreOS、VividCortex、Apcera、Digital Ocean,甚至 Mozilla 也在用 Go 构建 Heka,尽管 Rust 是他们正在开发的“内部”语言。当然还有我们 InfluxDB,但我有偏见。
我记得 2006 年去芝加哥参加首届 RailsConf。在 GopherCon 之前的几个月里,我多次告诉人们,我觉得这第一次 Go 大会会非常相似:充满了对新事物充满热情的技术专家,他们正处在伟大事业的开端。我发现确实如此,而且这种感觉被放大了 10 倍。也许 Go 比 Rails 在第一次大会时发展得更远,但我感觉这件事很容易比 Rails 更大。人们对这门语言以及用它构建的东西充满热情。这种热情将促成一个良性循环,即更多的开源、更多的库、更多的书籍、更多的博客文章以及更多的闭源,从而带来对 Go 开发者更多的需求。
如果我是一名今天刚入门的开发者,我会把职业生涯押在 Go 上。
我今天既是一名开发者,也是一名企业家,我正在 Go 上进行重大押注。但是,在过去的 10 年里,也出现过其他 Java 王位的潜在竞争者。为什么这次会有所不同呢?原因与我在本文开头列出的相同:简洁性、性能、并发性、健壮性和部署。在采用方面可能存在一些潜在的缺陷,我将在最后总结,但让我们依次看看每个优点。
首先,让我们谈谈简洁性。Go 在设计上是一种简单的语言。您可以阅读 Golang 网站上的规范和其他材料,并在一天内开始高效工作。就采用而言,这是一个巨大的优势。简单的语言更容易学习。这带来的绝妙副作用是,它们也更容易理解和阅读。Go 团队明确表示,他们优化了可读性。对于新手以及任何在团队中或长期项目上工作的人来说,这都是一个巨大的胜利。可读的代码更易于维护。Scala,一种我曾经认为会成为 Java 继任者的语言,却以其复杂性而闻名。我自己在 Scala 上工作一年多的经验证实了这一点,至少对我而言是这样。简洁性对于经验丰富的开发者和新手开发者来说都是一个巨大的优势,我认为这是 Go 最强大的优势。
Go 的性能对于 Java 开发者来说不是一个巨大的优势,因为他们已经做得相当好了。但对于我们这些动态语言的“难民”来说,Go 的性能是解放。无需处理反向代理来将事物发送到多个进程。真正的线程和利用每个核心的能力。异步 IO,但没有所有的回调。作为一名开发者,我甚至不必尝试从单个 Go 进程中获得每秒数千个请求。如果再努力一下,您将像 Apcera 一样获得每秒数百万个请求。
Go 的并发原语,即通道和选择器,使编写并发执行的代码成为一种乐趣。Go 的设计使您可以更轻松地利用每个核心并执行 IO 而不会阻塞整个进程。对于任何编写服务器基础设施代码的人来说,这两者都是巨大的优势。
考虑到 Go 实现的相对年轻,它的健壮性确实非常出色。我已经运行生产环境的 Go 代码一年多了,到目前为止我遇到的任何故障都完全是由于我自己的 bug。语言运行时本身非常稳定可靠。Java 也可以声称这一点,但对于我们这些动态社区的人来说,情况并非总是如此。它现在如此可靠的事实预示着运行时未来的改进。
然后是部署,Go 的部署非常出色。将 Go 代码部署到生产环境就像将单个二进制文件复制到服务器并运行它一样简单。无需反向代理,无需在目标服务器上安装依赖项,无需类路径。只需复制二进制文件并运行即可。对于我们在 InfluxDB 上的工作来说,与其他开源时序数据库的设置要求相比,这是一个巨大的优势。当您使用开源时,简单的安装非常棒,这将推动许多新的开源项目选择 Go。在过去一年中,我们已经看到了这一点,例如 Consul、etcd、Docker,甚至 CloudFoundry 也在转向 Go。
真正的问题是,有哪些因素会阻碍 Go 走向统治地位?一些开发者已经注意到 Go 缺少一些功能或其他一些东西:没有异常、用 nil 代替 option、无法指定依赖项版本、标记清除 GC、没有宏、没有泛型。我的感觉是,几乎所有这些抱怨都不会成为大问题。Go 的错误处理惯用法会将您引导到正确方向,即实际处理错误,而不是仅仅将它们冒泡到堆栈顶部。Nil 并没有阻止许多其他语言获得流行。依赖项版本控制可以通过 OSS 社区的工具来处理。除非 Go 团队决定放弃键盘并隐居山林,否则 Go 的 GC 会随着时间的推移变得更好。
唯一让我最担忧的抱怨是缺乏泛型。我个人认为这没什么大不了的,但当涉及到对集合进行排序之类的事情时,可能会有点烦人。我喜欢没有泛型的语言的简洁性,但不可否认的是,泛型确实使某些事情变得更容易。但是,无论好坏,Go 团队已经明确表示,泛型不会很快到来,甚至可能永远不会到来。所以我怀疑这是否会限制这门语言的受众。我的直觉是不会,但为了达到 Java 目前的流行程度,Go 需要吸引一些 Java 开发者加入它的阵营。
Java 真的需要被取代吗?Go 的进步是否足以证明它取代 Java 是合理的?我不认为这会带来 10 倍的生产力提升,但它几乎肯定是一种改进。但更重要的是,与使用 Java 开发相比,它确实让我感到幸福感提升了 10 倍。这可能就足够了,即使大量的现有 Java 开发者永远不会做出改变。新开发者选择 Go 而不是 Java 就足以随着时间的推移改变重心。这种转变将需要数十年时间,但如果 Google 和核心 Golang 团队继续成为这门语言的出色管理者,我可以想象 Go 占据主导地位的未来。
与此同时,我发现 GopherCon 的与会者和整个 Go 社区都是充满热情、聪明且务实的开发者。而这些正是我想要合作的开发者类型,这就是为什么我很高兴成为 Go 社区的一份子,并用这门语言构建开源项目。