谢孟军:我为什么选择使用Go语言? | EGO会员首期线上分享活动

为了加深EGO会员之间的相互了解,同时也为大家提供更多线上相互学习交流的机会,EGO正式启动会员群线上分享活动。本文是根据谢孟军分享的主题“Go与我”的内容整理而成。
首期分享嘉宾:谢孟军:EGO会员、GopherChina组织者、《Go Web编程》一书的作者,专注golang技术架构。

在这里我主要想和大家分享一些Go和我个人的成长史。首先聊聊Go,在2009年全部开源出来后,它获得了当年的年度语言,但是直到2011年它才发布正式的稳定版本。Go稳定版发布时,Go Team承诺后续的版本都会兼容之前的版本。这对于我们开发者来说简直太重要了,Go后续的版本也一直在提升内功,从而可以让我们无缝的升级Go版本。

Go的核心贡献者

Go主要有静态语言、天生并发、内置GC、安全性高、语法简单、交叉编译和编译快速这几个方面的特性。这些特性决定了Go的三个高富帅特性:运行快、开发快和部署快,而这些特性都是针对Google遇到的一些痛点来设计的。

图1

在说痛点之前,我们先来了解一下Go的作者和主要核心开发者们,图1是Go的三个作者从左到右分别是:Robert Griesemer, Rob Pike 和 Ken Thompson。Robert在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-8、plan9的作者;Ken主要是B语言、C语言的作者、Unix之父。

图2

再来看看其他核心贡献者,图2中Russ Cox也是目前Go的领导者之一,他和Rob Pike一起领导Go;Ian Lance Taylor是GCC的作者之一,目前负责GCC的Go实现;Brad Fitzpatrick之前是Memcache的作者,目前主要是HTTP2的实现作者。大家可以看到这些作者都是各个领域内的顶尖高手,所以当初我相信一群牛人做出来的Go也一定够牛。

为什么会设计Go语言?

当初他们为什么会有设计一个新语言的冲动呢?让我们一起来回顾一下这些历史,也许很多人对他们当年遇到的问题感同身受。

设计Go语言是为了解决当时Google开发遇到的以下这些问题:

  • 大量的C++代码,同时又引入了Java和Python

  • 成千上万的工程师

  • 数以万计行的代码

  • 分布式的编译系统

  • 数百万的服务器

其主要有以下几个方面的痛点:

  • 编译慢

  • 失控的依赖

  • 每个工程师只是用了一个语言里面的一部分

  • 程序难以维护(可读性差、文档不清晰等)

  • 更新的花费越来越长

  • 交叉编译困难

所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。

但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,所以新设计的语言一定要易学习,最好是C-like的语言;因为有太多的分布式系统、太多的开发者,所以新的语言一定要可以Scale,这个包括开发、工程师、代码、部署和依赖;20年没有出新的语言了,所以新设计的语言必须是现代化的(例如内置GC)等情况,他们觉得要实现这个目标就需要Go成为一个大家都认可的语言。

最后根据实战经验,他们向着目标设计了Go这个语言,其主要的特色有:

  • 没有继承的OO

  • 强一致类型

  • Interface但是不需要显示申明(Duck Type)

  • Function 和Method

  • 没有异常处理(Error is value)

  • 基于首字母的可访问特性

  • 不用的Import或者变量引起编译错误

  • 完整而卓越的标准库包

Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。我们来看看目前为止采用Go的一些国内外公司,国外的如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司,国内的如阿里云CDN、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。

Go主要应用的系统

上面那些基本上就是Go的历史背景和设计初衷,那么目前Go主要应用于哪些系统呢?

就我知道的来说,目前Go主要应用在下面这些系统:

  1. 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

  2. 分布式系统、数据库代理器等,例如Etcd。

  3. 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。

  4. 数据库,前一段时间Google开发的Groupcache,Couchbase的部分组建,Tidb,Cockroachdb,Influxdb等。

  5. 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的Apcera云平台。

为什么选择使用Go语言?

国内很多云创业公司都会选择把Go作为首要语言,例如DaoCloud。为什么会选择Go呢?与其他语言的应用相比,它有什么优点呢?

1、学习曲线

它包含了类C语法、GC内置和工程工具。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。

2、效率

Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。

3、出身名门、血统纯正

之所以说Go出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了。

4、自由高效:组合的思想、无侵入式的接口

Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。

5、强大的标准库

这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。

6、部署方便:二进制文件、Copy部署

我相信这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。

7、简单的并发

它包含了降低心智的并发和简易的数据同步,我觉得这是Go最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单。

8、稳定性

Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。

这里引用知乎里一个同学对Go评论的话:最开始准备上线的时候其实心里挺忐忑,毕竟一旦出现故障,不仅黑锅得自己背,面子也上过不去啊。还好结果蛮漂亮,自上线后没出现过一次突发性BUG,降低运维难度的同时还减少了机器的负载。我相信这也是大多数人用了Go之后的感言。

那么目前Go还存在哪些缺点呢?以下是我自己在项目开发中遇到的一些问题:

  1. Go的Import包不支持版本,有时候升级容易导致项目不可运行,所以需要自己控制相应的版本信息。比较好的现象是从Go 1.5开始Go对此就有重视了并支持Vendor。

  2. Go的goroutine一旦启动后,不同的goroutine之间切换不是受程序控制,runtime调度的时候需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了却突然冒出来又执行了,这会导致逻辑出错等情况。这个目前无解,应该属于调度器的优化。

  3. GC延迟有点大,我开发的日志系统伤过一次,同时在并发很大的情况下,处理很大的日志,GC没有那么快,内存回收不给力,后来经过Profile程序改进之后得到了改善。目前来看,GC已经优化的非常好了,给大家看一下Go1.5、Go1.6的GC前后对比图。

    图3

    图3是Go1.4升级到Go1.5之后的效果,从300ms到了50ms左右。

    图4

    图4是从Go1.5升级到Go1.6,从40ms到了2ms左右,可以说目前GC基本上不是Go的问题了。

  4. pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。

我的个人成长史

说完了Go再来说说我的成长经历,先说一说我的工作经历,我的第一份工作是在百视通,主要负责整个IPTV系统的研发,架构设计经历了从零开始到最后承受几百万用户的过程。但是那个时候我是PHP的追随者,经历了那四年多的磨难也开始让我觉得PHP不大适合开发后端程序,性能是它最大的问题。记得奥运会开始之前,我们为了调优性能,连续三天都是在公司奋战,用上了各种技巧,但最后的效果也只是提升了30%左右。

那时候我全部的工作就是PHP+C。

第二份工作是在盛大,那个时候创新院风风火火,我觉得云计算是一个很不错的理念就加入了创新业的云计算院。也是那个时候我认识了Go,认识了一批C++的牛人,同时也让我深度的接触了很多系统底层的开发。我加入的是CDN团队,我们团队主要是服务盛大游戏和盛大文学,流量和压力非常大,我觉得那两年是成长最快的,自己在系统底层知识上面得到了很大的提升。那个时候每天都感觉很充实,上班写公司的系统,下班回家坚持记笔记和写书,兼职偶尔还要喂奶。

盛大用Go写了好几个系统,印象最深刻的就是大文件分发系统,面对上百台机器的分发,节省到byte的流量算法,Go就是那个时候锻炼出来的,也是那个时候开始beego的第一个版本,基本上是模仿tornado框架的Go实现,用beego写了一个盛大创新院的短域名服务。

但是那时候桥哥开始转向了投资界,盛大创新院也开始走向了没落,同时中国的雾霾开始突如其来的出现了,记得那一年上海的PM值直接爆表了,儿子那个时候有咽炎,所以我毅然决定出国。

也是机缘巧合,新加坡一家电商公司Zalora打算从PHP转项Go,所以我就去了新加坡,在新加坡我主要做的是Mobile API。我用beego实现了他们整个后端的Mobile API,这个过程还是很艰难的,因为他们使用了大量的PHP,而且分层数据做的非常不干净,很多数据直接是PHP编码之后存储的,这导致我们需要用Go去实现PHP的反编码。但是也是那个时候我们实现了beego的swagger支持,一键开发API应用同时附带文档。

事情往往就是这样有缘分,我儿子在新加坡生病了,我和我老婆两个人无法很好的照顾好两个小孩,然后就又机缘巧合的回到了上海。总而言之,我是一个从世界上最好的语言(PHP)转到世界上另一个最好的语言的人。

 加入我们

(0)

相关推荐

  • Python和PHP到底选择哪个?Python入门教程

    对于开发初学者来说,选择学习哪门编程语言是很多人的疑问,毕竟不同的编程语言有各自的优缺点所在,尤其是在web开发领域,PHP和Python都有很好的表现,那么Python和PHP到底选择哪个?在这里小 ...

  • python和GO哪个更合适机器学习?

    GO语言和python语言都是大家比较偏爱的编程语言,很多人在转行的时候都会考虑GO语言和python,那么想要从业机器学习,python和GO哪个更合适? python是发展最快的编程语言之一,py ...

  • Python对比PHP有哪些优势?

    Python和PHP一样,同属于动态类型的解释型高级脚本语言,前景好.薪资待遇高.需求量大,深受大家的喜欢与追捧.这时有人就会问:PHP和Python一样,为什么学习Python的人更多呢?Pytho ...

  • 什么是Python?和PHP有什么差异?

    众所周知,编程语言有很多,其中包含Python和php,关于这两门语言,很多人都不太了解,下面小编带领大家来看看python和PHP的区别吧. 什么是python? python是一种高级面向对象的编 ...

  • Go 领军人物谢孟军:智能制造渴望银弹,首先要摒弃偏见

    积梦智能创始人 & TGO 鲲鹏会上海分会会长谢孟军 来源 | TGO 鲲鹏会厦门分会成立仪式 口述 | 谢孟军 整理 | Rainie Liu 2019 年 1 月 13 日,TGO 鲲鹏会 ...

  • 谢丽洁:浅夏(外一首)

    [总第140701期] 浅 夏   作者:謝丽洁 扶遥窗外 春已落幕 夏不觉间走来   叶不再娇嫩 争艳的花枯瑟 落瓣静息   青果似孩儿怯怯 时光告诉它必经风雨 才酿出甜果   苗儿葱长 身着翠衣炫 ...

  • 谢丽洁:新颜展(外一首)

    [总第138502期] 新颜展   作者:谢丽洁 小草 绿了河滩 柳枝绵柔戴发别簪 春娇花艳 光暖阳灿 风儿围转夸景秀山鲜 燕儿 归家杏枝站 兴冲冲的主人车房换 美丽山乡 面貌变 幸福路上新颜展 你挤 ...

  • 谢伦灿:行为和政策性壁垒将抑制原有文化企业的活动范围

    谢伦灿:行为和政策性壁垒将抑制原有文化企业的活动范围

  • 师生童话擂台:李永春VS谢慕冰|中国少儿文学微刊 第113期

    中国少儿文学微刊 第113期 执行主编:尹奇锋 师生童话擂台 李永春VS谢慕冰 李永春  作家.写作培训导师 七彩猫楼 小黄狗被窗外的一阵鸟叫声闹醒了,睁眼看了看墙上的挂钟,急了."迟到了, ...

  • 《新京都文艺》作者:谢述连《月季芳菲四月天》总749期⑥2021年99期⑥

    请点⤴ 新京都文艺关注公众号! 喜欢就常来看看! 这里有您关注更精彩! (点上面播放按钮可赏听音乐哦) 月季芳菲四月天 作者:谢述连 月季花儿红 四季香满园 月季红似火 绚烂而美艳 朵朵月季 在微风里 ...

  • 春运火车票如何安心购票?用C语言实现火车售票系统(源码分享)

    今年春运首日火车票12月30日正式开售.每年春运,不少乘客为购得一张回家车票,"八仙过海.各显神通",然而,总有部分乘客"神通失灵".今年春运火车票如何安心购票 ...

  • 谢德祯║《春分时节》外一首(诗)

    [诗]·春分时节(外一首) 谢德祯/文 春分时令吐芬芳,山青水秀景色光. 空中蜂蝶伴燕飞,河里鱼虾戏鸳鸯. 铁牛耕耘翻沃土,村民田间忙插秧. 老区新貌放光彩,乡村振兴普新章. 2021年3月24日 图 ...

  • 谢丽洁:爱意重温(外三首)

    [总第142502期] 爱意重温 文/谢丽洁 雾蒙远山 细雨绵绵 仿佛在讲述从前 青春时光 爱意浓浓手手相牵 经年几许小树已长成参天 今又重温还是那个雨雾天 把曾经浪漫炫染 鬓白的我们相扶相搀 树木鉴 ...