Java是我这一代的COBOL,而Go则是它的继承者(GopherCon后的其他反思)
作者:保罗·迪克斯 / 用例
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要想接近Java的流行程度,必须比Ruby流行一个数量级。
我为什么要关心流行度呢?因为流行度意味着更多的就业机会、更多的潜在招聘以及更多的工具和库。任何关心自己在市场上需求的(以及薪资潜力)的开发者,以及任何希望招聘的雇主,都应该将语言的生命周期纳入他们的语言选择因素。我相信还有COBOL程序员,但如果你在找工作,我不愿意成为他们中的一员;如果你是雇主,寻找一位合格的COBOL程序员或想要学习的人,我也不愿意成为这样的人。
让我们单独看看Go的流行度。最初的峰值是来自谷歌的公告,但右侧的曲线开始看起来很有趣。会议上有更多的图表显示了Go在过去的几个月里几乎呈垂直上升。
如果我是风险投资家,并且可以购买Go作为语言的期权,我会认真考虑。由于Go只是一个语言,他们将不得不在其他地方寻找:那些在Go上押注技术的公司、用Go编写的开源项目、开发者工具以及基础设施和托管。会议上有许多这样的公司和项目。我遇到并交谈的一些更有趣的包括Cloudflare、Hashicorp、CoreOS、VividCortex、Apcera、Digital Ocean,甚至Mozilla也在用Go构建Heka,尽管Rust是他们正在开发的“内部”语言。当然还有我们,InfluxDB,但这是有偏见的。
我记得2006年去芝加哥参加的第一个RailsConf。在GopherCon之前的几个月里,我反复告诉人们,我觉得这次第一个Go会议会很相似:充满了兴奋的 technologists,正在接触新事物,站在伟大事物的边缘。我发现它确实是这样的,但效果放大了10倍。也许Go比Rails在第一个会议上的发展更远,但我感觉这件事会比Rails更大。人们对这门语言和用它构建的东西都充满了热情。这种兴奋会转化为一个良性循环:更多的开源,更多的库,更多的书,更多的博客文章,以及更多的闭源,对Go开发者的需求越来越多。
如果我是今天开始起步的开发者,我会把我的职业生涯押在Go上。
我是一名开发者和企业家,今天我正在对Go进行重大押注。但,在过去10年里,Java王座上还有其他潜在的竞争者。为什么这一位会有所不同呢?原因与我在本帖开头列出的相同:简单、性能、并发、健壮性和部署。我会逐一分析每个优点,并谈谈采用过程中可能遇到的潜在问题。
首先,让我们谈谈简单性。Go是一种设计简单的语言。你可以在Golang网站上阅读规范和其他材料,并在一天之内开始变得富有成效。这在采用方面是一个巨大的优势。简单的语言更容易学习。这种惊人的副作用是,它们也更容易理解和阅读。Go团队明确表示,他们优化了可读性。这对新手和任何在团队或长期项目中工作的人来说都是巨大的胜利。可读的代码更容易维护。Scala,曾经我认为会是Java的继任者,以其复杂性而闻名。我一年多来与它合作的个人经验证实了这一点。简单性对经验丰富的和初出茅庐的开发者来说都是巨大的胜利,我认为这是Go的最大优势。
Go的性能对Java开发者来说并不是一个大的胜利,因为他们已经做得很好了。但对于我们这些动态语言难民来说,Go的性能是解放性的。不需要处理反向代理将事物发送到多个进程。真正的线程和利用每个核心的能力。异步IO,但没有所有回调。作为一个开发者,我甚至不需要尝试从单个Go进程中获得数千个请求每秒。如果你再努力一点,你将像Apcera一样获得数百万每秒。
Go的并发原语,即通道和选择,使得编写并发执行的代码变得非常愉快。Go的设计使得利用每个核心和进行IO而不阻塞整个进程变得更加容易。这对编写服务器基础设施代码的人来说都是巨大的胜利。
Go实现的健壮性真正令人印象深刻,考虑到它的相对年轻。我已经运行了一年的生产Go代码,迄今为止我所遇到的所有失败都完全是由于我自己的错误。语言运行时本身是坚如磐石。Java也可以在这方面提出要求,但对于我们动态语言社区的人来说,情况并不总是这样。它现在的可靠性预示着对运行时未来的改进。
然后是部署,使用Go语言进行部署非常出色。将Go代码部署到生产环境就像将单个二进制文件上传到服务器并运行那么简单。无需反向代理,无需在目标服务器上安装依赖,无需类路径。只需复制二进制文件并运行即可。与其它开源时间序列数据库相比,我们在InfluxDB上的工作取得了很大的成功。当你使用开源项目时,简单的安装方式非常棒,这将推动许多新的开源项目选择Go语言。在过去一年中,我们已经看到了像Consul、etcd、Docker以及CloudFoundry迁移到Go语言的项目。
真正的问题是,有哪些因素会阻碍Go语言的崛起?一些开发者指出Go语言缺少一些功能或其它一些问题:没有异常处理,使用nil代替选项,无法指定依赖版本,标记-清除GC,没有宏,没有泛型。我的感觉是,几乎这些问题都不会很大。Go语言中错误处理的习惯用法会引导你真正处理错误,而不是仅仅将它们向上传递到堆栈顶部。nil并没有阻止许多其他语言获得流行。依赖版本可以通过开源社区的工具来处理。除非Go团队决定放下键盘,去森林里生活,否则Go语言的GC将会随着时间的推移而变得更好。
唯一让我感到担忧的抱怨是缺少泛型。我个人觉得这并不是什么大问题,但在处理诸如排序集合等事情时,它可能会有些烦人。我喜欢没有泛型的语言的简洁性,但很难否认泛型确实使某些事情变得更容易。但无论好坏,Go团队已经明确表示,泛型可能不会很快到来,甚至可能永远不会到来。因此,我怀疑这是否会限制语言的受众。我的直觉是不会,但要达到Java当前的流行程度,Go语言将需要吸引一些开发者加入它的阵营。
Java甚至需要被取代吗?Go语言是否足够先进,以至于可以取代Java?我不认为它能让生产力提高10倍,但它几乎肯定是一个改进。但更重要的是,与在Java中开发相比,它确实让我的幸福感提高了10倍。即使大量当前的Java开发者不做出改变,这也可能足够。选择Go语言而不是Java的新开发者将随着时间的推移改变重心。这种转变将需要几十年,但如果Google和核心Golang团队继续成为如此出色的语言守护者,我可以想象一个Go语言主导的未来。
与此同时,我发现GopherCon的与会者和Go社区总体上都是兴奋、聪明和务实的开发者。这正是我希望与之合作的开发者类型,这就是为什么我兴奋地成为Go社区的一员,并在这个语言中构建开源项目。