共计 3841 个字符,预计需要花费 10 分钟才能阅读完成。
你好,我是陈皓,网名左耳朵耗子。
上个月,作为 Go 语言的三位创始人之一,Unix 老牌黑客罗勃·派克(Rob Pike)在文章“Go: Ten years and climbing”中,回顾了 Go 语言的倒退历程。文章提到,Go 语言这十年的迅猛发展快到连他们本人都没有想到,并且还成为了云计算畛域新一代的开发语言。另外,文中还说到,中国程序员对 Go 语言的酷爱齐全超出了他们的设想,甚至他们都不敢相信是真的。
这让我想起我在 2015 年 5 月访问 Docker 公司在湾区的总部时,Docker 负责人也和我表白了类似的感叹:他们齐全没有想到中国竟然有那么多人喜爱 Docker,而且还有这么多人在为 Docker 做奉献,这让他们感到十分意外。此外,他还对我说,中国是除了美国外乡之外的另外一个如此喜爱 Docker 技术的国家,在其它国家都没有看到。
确实如他们所说,Go 语言和 Docker 这两种技术曾经成为新一代的云计算技术,而且能够看到他们的倒退态势十分迅猛。而中国也成为了像美国一样在强力推动这两种技术的国家。这确实是一件让人感到高兴的事儿,因为中国在追随时代潮流这件事上曾经做得相当不错了。
然而就是在这样的背景下,这几年,总还是有人会问我是否要学 Go 语言,是否要学 Docker,Go 和 Docker 是否用在生产环境等等。从这些问题来看,对于 Go 语言和 Docker 这两种技术,国内的技术圈中还有相当大的一部分人在张望。
所以,我想写这篇文章,并从两个方面来阐述一下我的观点和认识。
- 一个方面,为什么 Go 语言和 Docker 会是新一代的云计算技术。
- 另一个方面,作为技术人员,咱们如何辨认什么样的新技术会是将来的趋势。
这两个问题是相辅相成的,所以我会把这两个问题揉在一起谈。
尽管 Go 语言是在 2009 年底开源的,但我是从 2012 年才开始接触和学习 Go 语言的。过后,我只花了一个周末两天的工夫就学完了,而且在这两天的工夫里,我还很快地写出了一个能完满运行的网页爬虫程序,以及一个简略的高并发文件解决服务,用于提取后面抓取的网页要害内容。这两个程序都很简略,总共不到 500 行代码。
综合下来,我对 Go 语言有如下几点领会。
第一, 语言简略,上手快。 Go 语言的语法个性几乎是太简略了,简略到你简直玩不出什么把戏,直来直去的,学习难度很低,容易上手。
第二, 并行和异步编程简直无痛点。 Go 语言的 Goroutine 和 Channel 这两个神器几乎就是并发和异步编程的微小福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步的编程形式管制起来就比较复杂了,并且容易出错,但 Go 语言却用十分优雅和晦涩的形式解决了这个问题。这对于编程多年受尽并发和异步折磨的我来说,齐全就是眼前一亮的感觉。
(图片来自 Medium:Why should you learn Go?)
第三,Go 语言的 lib 库“麻雀虽小,五脏俱全”。 Go 语言的 lib 库中基本上有绝大多数罕用的库,尽管有些库还不是很好,但我感觉这都不是次要问题,因为随着技术的倒退和成熟,这些问题必定也都会随之解决。
第四,C 语言的理念和 Python 的姿势。 C 语言的理念是信赖程序员,放弃语言的玲珑,不屏蔽底层且对底层敌对,关注语言的执行效率和性能。而 Python 的姿势是用尽量少的代码实现尽量多的事。于是我可能感觉到,Go 语言是想要把 C 和 Python 对立起来,这是多棒的一件事。
(图片来自 Medium:Why should you learn Go?)
所以,即使 Go 语言存在诸多的问题,比方垃圾回收、异样解决、泛型编程等,但相较于下面这几个劣势,我认为这些问题都是些小问题。于是就毫不犹豫地入坑了。
当然,一个技术能不能倒退起来,要害还要看三点。
- 有没有一个比拟好的社区。 像 C、C++、Java、Python 和 JavaScript 的生态圈都是十分丰盛和火爆的。尤其是有很多商业机构参加的社区那就更是人气爆棚了,比方 Linux 社区。
- 有没有一个工业化的规范。 像 C、C++、Java 这些编程语言都是有标准化组织的。尤其是 Java,它在架构上还搞出了像 J2EE 这样的企业级规范。
- 有没有一个或多个杀手级利用。 C、C++ 和 Java 的杀手级利用不必多说了,就算是对于 PHP 这样还不能算是一个优良的编程语言来说,因为是 Linux 时代的第一个杀手级解决方案 LAMP 中的关键技术,所以,也倒退起来了。
在我看来,下面提到的三点至关重要,新的技术只须要占到其中一到两点就曾经很不错了,何况有的技术,比方 Java 三点全都满足,所以,Java 的蓬勃发展也在情理之中。当然,除了下面这三点重要的,还有一些其它的影响因素,比方:
- 学习难度是否低,上手是否快。 这点十分重要,C++ 在这点上越做越不好了。
- 有没有一个不错的进步开发效率的开发框架。 如:Java 的 Spring 框架,C++ 的 STL 等。
- 是否有一个或多个巨型的技术公司作为后盾。 如:Java 和 Linux 前面的 IBM、Sun……
- 有没有解决软件开发中的痛点。 如:Java 解决了 C 和 C++ 的内存治理问题。
所以,Go 语言的将来是不可限量的。当然,我集体感觉,Go 可能会吞食很多 C、C++、Java 的我的项目。不过,Go 语言所吞食的我的项目应该次要是中间层的我的项目,既不是十分底层也不会是业务层。
也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到下层如 Java 业务层的我的项目。Go 语言能吞食的肯定是 PaaS 上的我的项目,比方一些音讯缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,他们没有简单的业务场景,也到不了特地底层(如操作系统)的软件我的项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更下层的业务层。这是我的一个判断。
好了,咱们再用下面的标尺来掂量一下 Go 语言的杀手级利用 Docker,你会发现根本是一样的。
- Docker 容易上手。
- Docker 解决了运维中的环境问题以及服务调度的痛点。
- Docker 的生态圈中有大公司在前面助力,比方 Google。
- Docker 产出了工业界规范 OCI。
- Docker 的社区和生态圈曾经呈现像 Java 和 Linux 那样的态势。
- ……
所以,早在三四年前我就感觉 Docker 肯定会是将来的技术。尽管过后的坑儿还很多,然而,绝对于这些大的因素来说,那些小坑都不是问题。只是须要一些工夫,这些小坑在将来 5-10 年就能够齐全被填平了。
同样,咱们能够看到 Kubernetes 作为服务和容器调度的关键技术肯定会是最初的赢家。这点我在去年初就可能很显著地感觉到了。
对于 Docker 我还想多说几句,这是云计算中 PaaS 的关键技术。尽管,这世上在呈现 Docker 之前,简直所有的要玩私有 PaaS 的公司和产品都玩不起来,比方:Google 的 GAE,国内的各种 XAE,如淘宝的 TAE,新浪的 SAE 等。但我还是想说,PaaS 是一个被世界或是被产业界重大低估的平台。
PaaS 层是承前启后的关键技术,任何一个不器重 PaaS 的公司,其技术架构都不可能让这家公司成长为一个大型的公司。 因为 PaaS 层的技术次要能解决上面这些问题。
- 软件生产线的问题。继续集成和继续公布,以及 DevOps 中的技术必须通过 PaaS。
- 分布式服务化的问题。分布式服务化的服务高可用、服务编排、服务调度、服务发现、服务路由,以及分布式服务化的撑持技术齐全是 PaaS 的菜。
- 进步服务的可用性 SLA。进步服务可用性 SLA 所须要的分布式、高可用的技术架构和运维工具,也是 PaaS 层提供的。
- 软件能力的复用。软件工程中的外围就是软件能力的复用,这一点也完满地体现在 PaaS 平台的技术上。
诚实说,这些问题的要害水平曾经到了能判断一家技术驱动公司的研发能力是否靠谱的水平。没有这些技术,我认为,依靠技术拓展业务的公司机会就不会很大。
在前面,我会另外写几篇文章给你具体地讲一下分布式服务化和 PaaS 平台的重要水平。
最初,我还要说一下,为什么要早一点地进入这些新技术,而不是期待这些技术成熟后再进入。起因有这么几个。
- 技术的倒退过程十分重要。 我进入 Go 和 Docker 的技术不能算早,但也不算晚,从 2012 年学习 Go,再到 2013 年学习 Docker 再到明天,我分明地看到了这两种技术的生态圈倒退过程。这个过程中,我播种最大的并不是这些技术自身,而是一个技术的变迁和行业的倒退。
从中,我看到了十分具体的各种浪潮和思路,这些货色比起 Go 和 Docker 来说更有价值。因为,这岂但让我从新思考我已把握的技术以及如何更好地解决已有的问题,而且还让我看到了将来。我岂但有了技术劣势,而且这些常识还让我的技术生涯有了更多的可能性。
- 这些要害新技术,能够让你提前抢占技术的先机。 这一点对一个须要技术领导力的集体或公司来说都是十分重要的。
如果一个公司或者一个人可能抓住技术红利,那就会比其它公司或集体有更大的影响力。一旦将来行业需要引爆,那么这个公司或这个人的影响力就会造成一个比拟大的护城河,并能够疾速地从中获取经济利益。
最近,在与中国移动、中国电信以及一些股份制银行交换的过程中,我看到通信行业、金融行业对于 PaaS 平台的了解曾经超过了互联网公司,而我近 3 年来在这些技术上的钻研让我也从中受益匪浅。
所以,Go 语言和 Docker 作为 PaaS 平台的关键技术前途是有限的,我很庆幸本人赶上了这波浪潮,也很庆幸本人在 3 年前就看到了这个趋势,所以当初我也在用这些技术开发相干的技术产品,并致力于为高速成长的公司提供这些关键技术。