这个月,是 Go 语言正式发布 10 周年,这也是 Go 作为开源编程语言和构建现代网络软件生态系统的 10 周年。
11月10日,Go语言的主要开发者之一 Russ Cox,在 Go 官方博客中发表了庆祝 Go 十年的文章。这篇文章中,他分享了关于 Go 语言最初的一些想法。
庆祝 Go 十周年让我回想起了 2009 年 11 月上旬,那时我们正在准备与世界分享 Go。我希望即使没有人最终使用 Go,至少也会引起人们对一些好想法的关注,尤其是 Go 在并发编程和接口上的想法,这些都可能对后续的编程语言产生影响。
我查看了 C, C++, Perl, Python 和 Ruby 等流行语言的发展历史,并研究了每种语言花了多长时间才被广泛采用。例如,Perl 在我看来是在 1990 年代中后期才形成的,并且具备 CGI 脚本和 Web 开发能力,但它其实早在 1987 年就首次发布了。
这一模式在几乎所有我所研究的语言中都有重复:在一门新语言真正腾飞之前,大约需要十年的时间进行沉寂,稳定的改进和传播。
那么经过了十年的发展,Go语言如今的发展如何?
Go语言的发展
虽然有点老生常谈,但是回顾 Go 的发展历史,我们依然能够看到这个本世纪才诞生的编程语言,给开发者和开源社区所带来的巨大影响。
Go 语言最初由 Google 公司的 Robert Griesemer、Ken Thompson 和 Rob Pike 三位大牛于2007年开始设计发明的。
Go语言三位创始人
其设计最初的洪荒之力来自于对超级复杂的 C++11 特性的吹捧报告的鄙视,最终目标是设计网络和多核时代的C语言。到2008年中期,语言的大部分特性设计已经完成,并开始着手实现编译器和运行,大约在这一年 Russ Cox 作为主力开发者加入。到了2009年,Go语言已经逐步趋于稳定。同年9月,Go语言正式发布并开源了代码。
Go语言开源伊始,人们对它的编译速度异常惊讶,它的编译几乎在一眨眼的时间就可以完成,要知道这在当时可以说是不可思议的,编译一个大型的C或C++项目所花费的时间甚至比你去喝咖啡的时间还要长。
举个当时的段子做例子:当你在工作时无所事事被老板抓包时,你可以很理直气壮的告诉他你在等待编译,而老板却对你无可奈何。
Go 语言使用了更加智能的编译器,简化了解决依赖的算法,同时也提供了更快的编译速度。
Go 语言对并发的支持也是这门语言最重要的特性之一。原生的并发支持一直到今天都是 Go 语言吸引开发者的最大优势。
Go 并发特性
当然,Go 语言最开始的设计依然有些粗糙,相比当时已经成熟稳定的Java、C/C++,甚至PHP、Python,以及当年刚刚展露头角的 JavaScript 和 Ruby,Go的各种特性还不够完善。但是在它所能解决的问题上,十年之后的Go语言,依然是最佳选择。
而过去的十年里,在全球 Go 开发者的帮助下,已经将最初的想法和草图发展为生产型语言,具备出色的工具集、生产级实现、先进的垃圾回收机制和支持 12 种操作系统和 10 种架构的迁移,这是属于每一位Go开发者的努力。
GoLint——Go自带的格式化代码工具
就像 Russ Cox 所说:
Go 现在无处不在
全世界至少有 100 万开发者在使用
全球各地的公司仍在寻求更多的 Go 开发者。
Go 语言的应用
Go 是互联网时代的 C 语言,第一位提出这个观点的是现七牛的CEO许式伟,老许是国内第一的 Go 鼓吹者,名副其实;而且许式伟的鼓吹不仅停留在嘴上,更是付诸于实践:七牛云的基础设施基本都是 Go 开发的。
如果在几年前很多人还会对这个观点疑惑甚至不解,但现在来看:事实已经胜于雄辩。
当前 CNCF 基金会 (Cloud Native Computing Foundation) 管理的项目中,有一大半都是 Go 语言开发的,包括 Kubernetes、Prometheus、etcd等等炙手可热的项目;这还不包括目前一统江湖的 Docker 容器。事实证明:Go 已成为互联网时代、云时代基础设施领域、云服务领域的最具竞争力的编程语言。
Go在企业中应用
以上技术分享资料,可扫描文章底部二维码限时免费领取
未来的展望
一个10岁的年轻编程语言现在已经成为一个规模庞大且不断发展的行业的主导者,这样的成功以前只是存在于在想象中,而这个想象在今天成为了事实。
2012 年 3 月 28 日,Go 1 正式发布。通过不断改进实现, Go 移植到很多新的系统上,几乎重写了所有对性能比较敏感的地方,让 Go 运行更为高效,还开发了很多重要工具。
如今,Russ 希望在社区的帮助下共同实现 Go 2。而 Go 今天的目标和十年前依然相同:
Scale(规模化)
Go的目标——规模化
从最开始解决 Google 内部的规模化问题,到 Go 公开后让程序员更高效地管理两类规模化问题:
一个是产品的规模化,特别是要与很多服务器交互的并发系统,比如云计算系统、大数据系统;
一个是开发的规模化,特别是由大量松散协作的工程师共同编写的大规模代码库,比如现代的开源软件。
而这不仅仅是 Go 所面临的挑战,随着互联网的规模化,云计算的时代,任何的大规模系统都需要解决规模化问题。所以除了Go语言工程师,我们可以看到越来越多的后端开发,除了工作大量使用的Java/Python/NodeJS之外,Go也成为招聘必备的一项技能。
精通一门编程语言(比如Java),再对照其他编程语言(比如Go),会对程序设计和产品业务的关联有更深入更透彻的理解与实践。作为已经有着开发经验的你,不只是要编写业务代码,写CURD,更多的需要思考软件工程/互联网工程上的设计问题,就像王垠所说:
编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋。
Go语言以及它的社区,在十年中积累了大量实践经验和资料,通过学习这些资料,可以在最快的时间内从编码的工人提升为有自己设计思考的工程师。