谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

即将开播:6月19日,互联网银行架构师魏生谈互联网开放银行实施路径的探索与思考

 本文转载自公众号“读芯术”(ID:AI_Discovery)

很多软件工程师视Python为比较喜爱的语言之一,工作生活都和它死死绑定在一起。但Google, Uber, Dropbox, Soundcloud, Slack, 和Medium的软件工程师并不是这样。长期以来,优秀企业的程序员们一直迷恋于另一种语言。

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

尽管大部分开发者还在使用Python,但无论是对于API、网页服务,或是数据处理,高级员工都已经增加了对于Golang(Go)的使用,它的表现棒极了!

由先驱建立

Go是由谷歌的一个全明星三人组发明的:

  • Rob Pike参与开发了Unix环境,并参与创建了Limbo编程语言。
  • 有了Ken Thompson,这个团队就有了Unix和B语言(C语言的前身)的发明人。
  • Robert Griesemer是谷歌的V8 JavaScript机器的负责人之一,同时也是谷歌创造的另一门语言——Sawzall的主要开发者。

谷歌最初正是用Python编写的,但是在2007年前后,工程师们正在寻找一种更好的语言来执行谷歌的主要任务。

Rob Pike在2012年的一次篇演讲中提到了他们遇到的问题:

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

  • 构建缓慢:生成新代码需要很长时间。
  • 依赖路径不可控:你是否曾经试图安装一个软件包,结果却发现你不得不安装至少5个其他的依赖路径和无数的子依赖路径来让它运行?是的,即使是谷歌人也有这个问题。
  • 版本偏离:由于到处都是重复的代码,工程师可能只会更新原始代码片段的一个版本,而忘记其他版本。因此,最终得到的版本既包含新代码,也包含旧代码。
  • 编写自动工具较困难:编写自动写代码的程序是可能的——事实上,大多数程序在某个阶段都会这样做。但在现代编程语言中,这仍然很难实现。
  • 每个程序员都使用语言的不同子集:对于Python,一个开发人员可能使用numpy包,另一个更喜欢scipy包。诸如此类,当程序员想要将他们的代码混合到一个包中时,情况就会变得混乱。
  • 程序理解能力差:那些说自己一读代码就懂的人是在撒谎,它不是一个简单的“Hello World”程序。而且代码的文档通常帮不上什么忙——在大多数情况下,它甚至不存在,或者被编得很糟糕。
  • 重复操作:你是否曾经从程序的某个部分复制一段代码?这是不好的做法。但大多数编程语言都使其易于实现。
  • 更新成本高:在上面描述的这种混乱情况下,更新软件需要花费大量的时间和脑力。
  • 跨语言构建:Python适合于中小型脚本,c++适合于复杂的程序,Java适合于web开发,Haskell适合于有惰性但稳健的代码。结果是,一个程序常常包含许多不同语言的代码片段。但是为了编译、调试和保持简洁,用一种语言编写程序要好得多。

于是三人组开始设计一种干净、简单、易读的语言。一种可以消除或至少减轻软件工程中这些常见问题的语言。

一门精简的语言

这些常见问题的根源在于现代语言的复杂性。想想Python或C——你有没有试着阅读过整个文档?祝你好运。相比之下,Go比较大的特点就是简单。这并不意味着你不能用它来构建复杂的代码。但Go考虑到了,不要有引入复杂性却不能解决问题的特性。

例如,Go不像其他面向对象语言那样有类。作为其他语言中常用功能,类可以使一个对象继承另一个对象的属性。

问题是,如果试图改变一个对象的结构而不改变其他对象的结构,就会破坏代码。Go有一个被称为struct替代方法,其更偏向组合而不是继承。

Go的其他主要特征是:

  • 类型安全:在C语言中,使用光标做任何事情——包括使程序崩溃。Go不会让你这样搞砸东西的。
  • 正交性:这意味着如果在代码中更改一个对象,其他对象不会因此而更改。与C语言不同的是,比如,如果你改变了一个变量,那么其他的变量也会随之改变。Go是正交的,因为它使事情更简单。
  • 最小化:在Go中,只有一种方法来编写代码。而Python有无数种方法来编写一个东西!
  • 可读性高:和Python一样,Go会把可读性放在第一位。因此它相比大多数语言来说对新手更友好,也使维护代码更容易。
  • 文档化:尤其对于初级开发人员,他们觉得为了使别人可以使用代码而写一些关于代它的简介是很乏味的。使用Godoc,这个过程会比大多数语言更加自动化,开发人员不需要浪费宝贵的时间来记录他们所做的事情。
  • 实用性:重要的东西应该易于编写代码,即使这意味着其他事情不可能在Go中完成。逻辑是,你希望通过使重复的任务变得快速和简单来提高开发人员的效率。如果有更复杂的问题他们可以用另一种语言来写。

或许这些听起来毫无创意,从某种意义上说,确实如此,这不是一种带有时髦特征的语言,Go不是一种用来探索和研究的语言。

但神奇之处正在于此,当你尝试着去创造一些能运行的东西的时候,当你在一个团队中,有许多不同背景的人在同一个代码上工作的时候,当你厌倦了其他语言带来的混乱的时候,Go能救你于水火。

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

日益繁荣的社区

由于其简单性,Go是当今存在的很具协作性的语言之一。过去程序员们总是坐在自己的小隔间里,从不与别人见面,这样的时代已经一去不复返了。

现在,我们有StackExchange来解决所有的编码问题。我们有Slack,Zoom,Google Meet等来和我们的团队保持联系。但现代语言仍然是为小隔间里的小书呆子量身定做的。

Go改变了这种局面。尽管比Python晚了20岁,但它拥有一个充满活力的社区。他们将尊重、开放和友好置于行为准则之上,虽然其他语言,如Python或C,也有类似的社区声明,但对这些基本价值观的强调较少。

因此,社区在Go年度调查中扮演着明确的角色也就不足为奇了

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

有关社区和领导力的问题 | 图源:2019

数据不言自明

根据2019 Go Survey,谷歌的语言主要用于网站开发、网络和系统编程。Python的前景看起来与之非常相似:

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

Python的使用数据 | 图源:2019 Python

唯一显著的区别是有多少Python用于数据分析和机器学习。在这些领域,其他热门的新语言也正在涌现。

你可以看到许多Python的用法都可能被Go所取代,包括46%的网络开发46%,37%的系统管理和DevOps中,以及19%的网络编程中。即使你认为许多开发人员完成了所有这三种工作,至少一半的Python支持者正在做他们在Go中可以做的事情。

事实上,开发人员已经意识到Go提供的巨大潜力。根据Hackerrank的数据,在2019年,大约有三分之一的程序员想学Go。

谷歌的语言何以战胜Python?50%的人都应该立即学习Golang

接下来的热门语言 | 图源:Hackerrank.

由于Go非常容易学习,我们应该会在未来几年看到从Python到Go的转变。虽然对于大多数公司,尤其是不像Dropbox或Medium那样庞大有钱的公司来说,把所有的代码重写用Go编写将是非常昂贵的。但对于新项目来说,你至少应该尝试一下。