导读 两位创造者Rob Pike和Robert Griesemer一起探讨了Go成功的原因。

常言道,历史不会重演,但总会惊人的相似。

如果您想创建一种编程语言,多向那些有经验的人士学习,他们有很多可取之处。在《Go Time》第100期节目中,两位Go语言的创造者Rob Pike和Robert Griesemer一起探讨了他们的经历。

以下是他们认为取得成功的5大原因。

正式的语言规范

在讲述这个项目的起源时,Rob说:“我们经过六个多月的头脑风暴和思想成形之后,我们做的第一件重要的事情,就是花了几个星期写了一份正式的语言规范,我认为这是项目成功的关键部分。” 该规范引起了其他工程师的兴趣,比如Ian Lance Taylor。

还有最重要的事情之一是Ian Taylor看到了规范,并决定为它编写一个编译器。有一天他走进我们的办公室说:“顺便说一下,我为你们的语言做了一个编译器。” 这是一个多么神奇的时刻。当然,他后来成为了团队的一员,现在他还在为Go工作。

杀手锏App

Rob说当时并没有重点考虑为什么要引入Docker 的,大概是为了使Go语言对系统程序员有吸引力?

是的,Docker现在是我们的杀手锏App,因为它是用Go编写的,运行良好,它成为了现在所谓的云计算的核心……我们过去只称它为系统编程或服务器。事实上,只要有一项重要的技术是用Go语言写的,这就证明了它的用武之地。我认为Go确实是一种很好的语言。

后来又出现了Kubernetes。能够使用你的语言编写重要的软件,这是取得成功的一个重要部分。如果一门语言没有任何应用内容,那么它有多好就无关紧要了。

他们建立了一个开源社区

Rob相当坦率地谈到了他们在开放源码世界中所面临的挑战,这让人耳目一新。

我确实认为这个团队并没有真正准备好与开源社区进行交互。Ian是我们中唯一一个在开源世界中待了很长时间的人,他在社区中做的事情比他应得的要多。

我们花了很长时间才理解开源社区意味着什么,比如有一个项目,该项目是由公司支付,但有很多开源贡献者…我们早期有很多出色的开源开发。Windows的移植完全是由外部贡献者完成的,这非常棒……社区的输入也很关键。

有时人们认为社区受谷歌控制太多了,这是他们的观点,我不同意;我认为他们低估了团队听取开源社区的意见、处理所有问题的能力……

建立开源社区,这是一件很有挑战性的事情,因为有成千上万的人(现在全世界有数百万的Go程序员),他们都对这件事有自己的看法,也知道如何去做。每个人都想要不同的东西,但是这很棘手,很难平衡。

不会改变其他语言

这一点一开始有点违背常理。通常对于软件来说,要推崇其可塑性,而要避免僵化。然而,Rob很好地解释了这一点。

我们故意这样做,对于Go语言我们承诺不改变任何东西。这对语言的成功至关重要,因为它使企业相信我们所做的事情和依赖我们不会破坏他们的东西。我想很多人没有意识到这一原则。我们没有破坏人们的程序,即使这是一个有十年历史的项目。这多么令人难以置信,但正因为如此,我们才走到现在。

坚持自己的信仰

当面对社区的不良反馈以及团队如何做出改变的时候,Rob说:

Go的一些特点对它的成功至关重要,但人们并不喜欢,我们对此也直言不讳。我想您提到的,未使用变量的编译错误就是其中之一。这是令人非常恼火的,哪怕你忘记删除一个未使用的变量,你的程序将出现编译错误。但对我们来说,这是Go语言出彩的地方。虽然不能阻止你写“坏”代码,但我们试图告诉你…这样可以避免你的程序很慢,或者你的代码难以维护。

其实真正让人们抓狂的是,Go不允许导入你不使用的库。这对我们来说是至关重要的,因为程序构建和处理大量二进制文件会花费很多时间,我们确保您的程序的依赖项正是您所需要的。但对很多人来说,每次编辑并删除打印语句或其他内容时,编译器都会说“你没有使用这个库”,这简直是太烦人了。

后来,Brad编了一个基于gofmt的goimports,为你管理那些编译项,这基本上平息了那些抱怨。

以上就是Rob Pike的Go语言成功的5件事。整个对话都很精彩,值得一听。你还在等什么?

一起探讨Go 语言为什么能成功?的更多相关文章

  1. (转)如何学好C语言,一个成功人士的心得!

    zidier111发表于 2013-1-26 08:59:05   今 天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所 ...

  2. 怎样学好C语言,一个成功人士的心得!

    今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了全部的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的 ...

  3. 【C语言学习笔记】C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

  4. [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别

    C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...

  5. 关于Quartus构建nios软核以及eclipse建立c语言工程以及成功下载到FPGA芯片过程遇到的各种问题以及解决方法详解

    这不是一篇构建nios的教程,而是遇到的各种问题以及解决方法.至于构建教程,网上一大把,我推荐正点原子的FPGA教程,比较新,比较详细,通俗易懂!!! 这里以一个点亮LED灯的Nios软核为例,很明显 ...

  6. eclipse建立c语言工程以及成功下载到FPGA芯片过程遇到的各种问题以及解决方法详解

    推荐大家预先建立好一个工程目录文件夹,确实挺好用,参考正点原子的pdf教程,如下图所示, 我们eclipse在software文件夹建立一个workspace即可 选择用helloworld模板建立工 ...

  7. Go语言核心36讲(Go语言实战与应用四)--学习笔记

    26 | sync.Mutex与sync.RWMutex 从本篇文章开始,我们将一起探讨 Go 语言自带标准库中一些比较核心的代码包.这会涉及这些代码包的标准用法.使用禁忌.背后原理以及周边的知识. ...

  8. go语言环境搭建+sublime text3(windows环境下)

    感觉有点坑,整了一下午~搞定 go语言环境搭建+sublime text3(windows环境下) 1.安装sublime text3 2.安装go语言程序包 3.测试go语言是否安装成功     键 ...

  9. dynamic2016 crm 安装语言包提示缺少组件报错

    当安装dynamic2016 CRM英文语言包安装成功后,在系统切换语言的时候提示如下报错为缺少CRM reporting extensions 插件导致,在CRM的解压安装包如下路径找到对应的执行文 ...

随机推荐

  1. http://localhost:8080/sockjs-node/info?t=1556418283950 net:: ERR_CONNECTION_REFUSED(亲测有效~!)

    如果你的项目没有用到sockjs,vuecli3 运行npm run serve 之后network里面一直调用一个接口:http://localhost:8080/sockjs-node/info? ...

  2. Analog power pin UPF defination

    在一个analog macro端口上,有些pin是always on的,有些是shut down的,如何描述这些pin的power属性?这是一个常见问题,驴就此机会大致描述一下常见的做法.对于这个问题 ...

  3. Spring JdbcTemplate类常用的方法

    execute(String  sql) 可执行任何sql语句,但返回值是void,所以一般用于数据库的新建.修改.删除和数据表记录的增删改. int  update(String sql) int  ...

  4. Vue - 如何使用npm run build后的dist文件夹

    脚手架vue cli生成项目后,使用 npm run build 生成了一个dist文件夹(应该是distribution的缩写) 只要放在http服务器上就可以运行. 使用一句python命令可以搭 ...

  5. sshpass远程登陆

    1,ssh ssh 端口为默认22的时候: sshpass -p 888888 scp -o StrictHostKeyChecking=no /root/images.zip root@21.1.9 ...

  6. 查看Oracle的表中有哪些索引(用user_indexes和user_ind_columns)

    用user_indexes和user_ind_columns系统表查看已经存在的索引 对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexes和user_ind_columns ...

  7. opencv:图像的读取,显示,写入文件

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  8. 1、TensorFlow如何工作?

    TensorFlow特殊的张量计算引擎使得TensorFlow能够很好的满足机器学习的计算需要,从2015年开始发起 本书基于TensorFlow0.12+和python3.0+ 环境安装要求 pip ...

  9. Django ORM 常用的13个方法

    介绍一个可以以py脚本方式运行ORM操作的方法: 可在项目内新建个py文件,复制项目内manage.py文件中的以下代码: if __name__ == "__main__": o ...

  10. jmeter beanshell 使用参数引用

    1.直接使用beanshell 写代码引用: 2. beanshell  引用.java 文件 3.beanshell 引用jar 包