CategoryResourceRepost/极客时间专栏/左耳听风/技术基础/08 | Go语言,Docker和新技术.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

119 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="08 | Go语言Docker和新技术" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cc/fc/cc1d92bc8e0d0b5af18d83326af53efc.mp3"></audio>
上个月作为Go语言的三位创始人之一Unix老牌黑客罗勃·派克Rob Pike在新文章“Go: Ten years and climbing”中回顾了Go语言的发展历程。文章提到Go语言这十年的迅猛发展快到连他们自己都没有想到并且还成为了云计算领域新一代的开发语言。另外文中还说到中国程序员对Go语言的热爱完全超出了他们的想象甚至他们都不敢相信是真的。
这让我想起我在2015年5月拜访Docker公司在湾区的总部时Docker负责人也和我表达了相似的感叹他们完全没有想到中国居然有那么多人喜欢Docker而且还有这么多人在为Docker做贡献这让他们感到非常意外。此外他还对我说中国是除了美国本土之外的另外一个如此喜欢Docker技术的国家在其它国家都没有看到。
的确如他们所说Go语言和Docker这两种技术已经成为新一代的云计算技术而且可以看到他们的发展态势非常迅猛。而中国也成为了像美国一样在强力推动这两种技术的国家。这的确是一件让人感到高兴的事儿因为中国在跟随时代潮流这件事上已经做得相当不错了。
然而就是在这样的背景下这几年总还是有人会问我是否要学Go语言是否要学DockerGo和Docker能否用在生产环境等等。从这些问题来看对于Go语言和Docker这两种技术国内的技术圈中还有相当大的一部分人在观望。
所以,我想写这篇文章,并从两个方面来论述一下我的观点和看法。
<li>
一个方面为什么Go语言和Docker会是新一代的云计算技术。
</li>
<li>
另一个方面,作为技术人员,我们如何识别什么样的新技术会是未来的趋势。
</li>
这两个问题是相辅相成的,所以我会把这两个问题揉在一起谈。
虽然Go语言是在2009年底开源的但我是从2012年才开始接触和学习Go语言的。当时我只花了一个周末两天的时间就学完了而且在这两天的时间里我还很快地写出了一个能完美运行的网页爬虫程序以及一个简单的高并发文件处理服务用于提取前面抓取的网页关键内容。这两个程序都很简单总共不到500行代码。
综合下来我对Go语言有如下几点体会。
第一,**语言简单,上手快**。Go语言的语法特性简直是太简单了简单到你几乎玩不出什么花招直来直去的学习难度很低容易上手。
第二,**并行和异步编程几乎无痛点**。Go语言的Goroutine和Channel这两个神器简直就是并发和异步编程的巨大福音。像C、C++、Java、Python和JavaScript这些语言的并发和异步的编程方式控制起来就比较复杂了并且容易出错但Go语言却用非常优雅和流畅的方式解决了这个问题。这对于编程多年受尽并发和异步折磨的我来说完全就是眼前一亮的感觉。
<img src="https://static001.geekbang.org/resource/image/8d/5f/8df5fd56cbb6343a9030265a5f3a565f.png" alt="" />
第三,**Go语言的lib库“麻雀虽小五脏俱全”**。Go语言的lib库中基本上有绝大多数常用的库虽然有些库还不是很好但我觉得这都不是主要问题因为随着技术的发展和成熟这些问题肯定也都会随之解决。
第四,**C语言的理念和Python的姿态**。C语言的理念是信任程序员保持语言的小巧不屏蔽底层且对底层友好关注语言的执行效率和性能。而Python的姿态是用尽量少的代码完成尽量多的事。于是我能够感觉到Go语言是想要把C和Python统一起来这是多棒的一件事。
<img src="https://static001.geekbang.org/resource/image/03/f7/03ea333bf7b7bb2fe350c4f433047df7.png" alt="" />
所以即便Go语言存在诸多的问题比如垃圾回收、异常处理、泛型编程等但相较于上面这几个优势我认为这些问题都是些小问题。于是就毫不犹豫地入坑了。
当然,一个技术能不能发展起来,关键还要看三点。
<li>
**有没有一个比较好的社区**。像C、C++、Java、Python和JavaScript的生态圈都是非常丰富和火爆的。尤其是有很多商业机构参与的社区那就更是人气爆棚了比如Linux社区。
</li>
<li>
**有没有一个工业化的标准**。像C、C++、Java这些编程语言都是有标准化组织的。尤其是Java它在架构上还搞出了像J2EE这样的企业级标准。
</li>
<li>
**有没有一个或多个杀手级应用**。C、C++和Java的杀手级应用不用多说了就算是对于PHP这样还不能算是一个优秀的编程语言来说因为是Linux时代的第一个杀手级解决方案LAMP中的关键技术所以也发展起来了。
</li>
在我看来上面提到的三点至关重要新的技术只需要占到其中一到两点就已经很不错了何况有的技术比如Java三点全都满足所以Java的蓬勃发展也在情理之中。当然除了上面这三点重要的还有一些其它的影响因素比如
- **学习难度是否低,上手是否快**。这点非常重要C++在这点上越做越不好了。
- **有没有一个不错的提高开发效率的开发框架**。如Java的Spring框架C++的STL等。
- **是否有一个或多个巨型的技术公司作为后盾**。如Java和Linux后面的IBM、Sun……
- **有没有解决软件开发中的痛点**。如Java解决了C和C++的内存管理问题。
用这些标尺来衡量一下Go语言我们可以清楚地看到
- Go语言容易上手
- Go语言解决了并发编程和底层应用开发效率的痛点
- Go语言有Google这个世界一流的技术公司在后面
- Go语言的杀手级应用是Docker容器而容器的生态圈这几年可谓是发展繁荣也是热点领域。
所以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层的技术主要能解决下面这些问题。
<li>
**软件生产线的问题**。持续集成和持续发布以及DevOps中的技术必须通过PaaS。
</li>
<li>
**分布式服务化的问题**。分布式服务化的服务高可用、服务编排、服务调度、服务发现、服务路由以及分布式服务化的支撑技术完全是PaaS的菜。
</li>
<li>
**提高服务的可用性SLA**。提高服务可用性SLA所需要的分布式、高可用的技术架构和运维工具也是PaaS层提供的。
</li>
<li>
**软件能力的复用**。软件工程中的核心就是软件能力的复用这一点也完美地体现在PaaS平台的技术上。
</li>
老实说,这些问题的关键程度已经到了能判断一家技术驱动公司的研发能力是否靠谱的程度。没有这些技术,我认为,依托技术拓展业务的公司机会就不会很大。
在后面我会另外写几篇文章给你详细地讲一下分布式服务化和PaaS平台的重要程度。
最后,我还要说一下,为什么要早一点地进入这些新技术,而不是等待这些技术成熟了后再进入。原因有这么几个。
- **技术的发展过程非常重要**。我进入Go和Docker的技术不能算早但也不算晚从2012年学习Go再到2013年学习Docker再到今天我清楚地看到了这两种技术的生态圈发展过程。这个过程中我收获最大的并不是这些技术本身而是一个技术的变迁和行业的发展。
从中我看到了非常具体的各种浪潮和思路这些东西比起Go和Docker来说更有价值。因为这不但让我重新思考我已掌握的技术以及如何更好地解决已有的问题而且还让我看到了未来。我不但有了技术优势而且这些知识还让我的技术生涯有了更多的可能性。
- **这些关键新技术,可以让你提前抢占技术的先机**。这一点对一个需要技术领导力的个人或公司来说都是非常重要的。
如果一个公司或是个人能够占有技术先机,就会比其它公司或个人有更大的影响力。一旦未来行业需求引爆,那么这个公司或是个人的影响力就会形成一个比较大的护城河,并可以快速地从中获取经济利益。
最近在与中国移动、中国电信以及一些股份制银行交流的过程中我看到通讯行业、金融行业对于PaaS平台的理解已经超过了互联网公司而我近3年来在这些技术上的研究让我也从中受益匪浅。
所以Go语言和Docker作为PaaS平台的关键技术前途是无限的我很庆幸自己赶上了这波浪潮也很庆幸自己在3年前就看到了这个趋势所以现在我也在用这些技术开发相关的技术产品并助力于为高速成长的公司提供这些关键技术。
[<img src="https://static001.geekbang.org/resource/image/1e/d0/1e6c69c5cccbd060a4bfef00cfb406d0.jpg" alt="unpreview" />](http://hm17640r6381.rdyhl.com/jump?activity_id=4658)