标签 Concurrency 下的文章

GopherChina2017以讲师身份参会感悟

时光荏苒。2016年北京GopherChina大会的情形还历历在目,2017年上海GopherChina大会又如约而至。

img{512x368}

一、印象

这是我连续第二年参加AstaXie组织举办的GopherChina大会。而且不同于去年的是,这次我是以讲师身份参与的。虽然大会地点不同,我的角色不同,但不变的是和广大Gophers一样的对Go语言的极大热情。

这也是第三届GopherChina大会。随着Go语言自身的快速演进以及Go在国内各个行业应用的快速增长,GopherChina大会在大中华区的影响力与日俱增:既得到了更多圈内赞助商的赞助,也得到了Gophers们的极大关注。有好多Gophers都是GopherChina大会的连续参加者,有些Gopher甚至连续参加了三届,我个人就看到了好多去年在北京大会上遇到的Gophers。这让能容纳近1500名观众的主会场又近乎爆满。举办和参加这样级别的技术大会,无论是对于主办方还是观众都是一种考验。索性的是,在谢大和相关工作人员的不懈努力之下,两天的大会举办的是很是成功,大会紧凑而有序。并且在第一天晚上举办的技术Party上,大胡子Dave Cheney还为我们带来了“Gopher puzzlers”。这让技术party的气氛一下达到了高潮。

二、选题考量

由于本次是以讲师身份参加的大会,因此这里就不打算像去年那样对其他讲师以及其presentation进行点评了(若要看点评,可以移步到知乎上小伙伴开的贴子)。这里我主要来说说我这次参会的选题以及个人对于类似GopherChina这样的技术大会应该讲些什么的理解。

年初,谢大在征集GopherChina的topic的时候问我是否愿意在今年的GopherChina大会上做分享?说实话我非常想去分享,自己也是一个爱分享之人。但是分享什么topic的确是一个问题。自己研究Go较早,但一直没有全职Go,直到去年才开始成为full-time Go。而自己对GopherChina这类技术大会分享的主题也是有自己的想法的,那就是希望大会能像美国丹佛举办的gophercon大会一样,多一些关于Go语言本身的Topic。于是我就有了自己来分享一个关于Go语言自身的topic的想法,和谢大做了沟通后得到了谢大的支持。下面的topic初步描述反映了我当时关于slide的思路规划:

*“2016年Go语言问鼎TIOBE编程语言排行榜的年度语言,证明了Go语言在全世界范围内的蓬勃发展之势,将来会有越来越多的开发人员加入到Gophers行列。Go以语法简单、门槛低、上手快著称。但入门后很多人发现要写出地道的、遵循Go思维的代码却是不易。为此,在本次分享中,作者将结合Go team的talk资料、参考和提炼Go标准库以及主流Go开源项目的精华源码风格和惯用法,和大家一起探讨《go coding in go way》之道。” *

关于这样的一个主题,我的心理也是忐忑的,内心中有种赶脚:这个topic有些大啊!在阅读代码、收集和整理资料方面的工作肯定也不少,于是我早早开始了一些资料收集工作。

最初我的topic是偏向于go idiomatic tricks或best practice这个方向的,但随着准备工作的进行,我的头脑中出现了几个疑问:Go诞生这么多年,go idiomatic tricks或best practice已经为人知晓,但很多问题并无定论,我是否可以探讨一下呢?比如:Go的编程思维到底是如何形成的?为什么Go上手易,写出idiomatic的code难呢?我是否能再上一个层次,将go idiomatic tricks或best practice这些冰山上面的具现事物的底层根源找出来呢?这时恰逢国内上映《降临》这部美国大片,在电影院看完片后,我思考着影片中的理论核心:“萨丕尔-沃夫假说”并陷入沉思。

于是乎那天晚上我就有了一个关于topic的新的想法,那就是探究Go编程思维背后的东西。但考虑到如何应用编程思维去写go代码,我又阅读了大量go stdlib、kubernetes的代码,试图在这些代码中找到”Go语言编程思维”的应用实例并补充的slide中。这样slide的大体结构就出来了:

铺垫
    - “萨丕尔-沃夫假说” 作为引子,说明语言与思维的联系
    - 针对一个问题的三个语言版本实现,说明编程语言对编程思维的影响
    - 提出:语言价值观是语言影响思维的根本(一个示意图阐述模型)

价值观
    - Go语言的价值观的形成和价值观内容
    - 每种价值观下的语言设计
    - 每种价值观主导下的Go编程思维
    - 这写Go编程思维的具体运用实例

而随着资料准备的深入,逐渐完成了价值观(“全面简单”、“正交组合”和“偏好并发”)与编程思维的内容体系构架(大纲):

   Overall Simplicity
        - short naming thought
        - minimal thought

   Orthogonal Composition
        - vertical composition thought
        - small interface thought
        - horizontal composition thought

    Preference in Concurrency
        - concurrency thought

其实在这个资料准备过程,我个人对于Go语言的理解也得到了一定的升华,也更加理解Go的设计者在当初设计语言时做出的一些选择了,并且感觉在面对实际业务问题时、在代码设计时,更加有道可循了。

临近大会,开始写slide。本着present in go way的思路^_^,我首选go present tool支持.slide格式文档,最后形成了近70 pages的文档。我也感觉页数有些多,并且每次自己彩排一遍都超时。但页面之间逻辑紧扣,武断地删除一页又担心思维跳跃,不便于整体理解,于是硬着头皮将所有内容都保留到了最后。

三、Presentation分析

不过实际presenting过程,我依然超时了:(了,整个presentation过程并不顺利。

  • 首先是大会的屏幕分辨率似乎有些问题,slide的标题部分根本没有显示出来,这直接导致在座的gopher们看不清我的思路体系,内容让人感觉突兀。就像知乎上ezbuy 翁总的“批评”:“不知为何说变量统计”。
  • 其次,不得不承认自己在千人面前speaking,的确紧张紧张紧张啊,尤其是初期,节奏变慢,有些东西没有讲出来,可能会让在座观众感觉思路有跳跃;
  • 再次,也许gopher们更关心编程思维下的具体展现,也就是后面的代码部分,但由于前面节奏控制不好,铺垫部分有些多了,占用了大量时间,而导致后面代码部分讲解非常快。
  • 再再次,每个会场的gopher的关注点不同,一些gopher可能更喜欢像“微服务实战”这样的一些关于他们目前所遇到问题的解决方案的topic。
  • 最后,话题大,不够聚焦。自己准备这类规模大会topic时的经验还是不足。即便讲语言本身,也应该聚焦,就像Dave CheneyFrancesc Campoy的topic那样,只把一个事情的来龙去脉讲透。

纵观前两届gopherchina大会,国人讲关于Go语言自身层面topic的比例较低,甚至可以用凤毛麟角来形容。更多topic集中在某一业务领域的产品、架构、原理和工程上的实践等。我并不是说这些topic不好,毕竟像GopherChina这样规模的大会需要topic的多样性。只是这一届我要挑战一下自己,虽然结果不是那么理想。

不过,即便被吐槽,其实也没什么,说明和优秀的Go讲师相比,自己的确是有差距的。有差距就努力去弥补呗。如果下一届还有机会分享,我还会分享与Go语言相关的topic,只是要吸取经验,更加聚焦。

四、回复吐槽

在这里也回复一下几个gopher的吐槽:

1、”过度吹捧Go”

我真想不出为何这位Gopher能有这种想法。

首先在Gopher大会上,说Go肯定是没问题的。我从来都说Go是一门牛逼的语言,但从来没说Go是最好的语言。
至于所谓的上升到“价值观”的层面,那是对一门编程语言本质上的探讨,是对Go代码设计思维本源的思考,无关吹捧或不吹捧。
任何一门编程语言都有设计者自己背后的理解和选择,都可以上升到价值观。

不过我不能否认的是上升到编程语言价值观这个层次,是需要一定编程语言积累的。所以初学者体会不到也是正常的。慢慢来:)

2、“一些模凝两可的结论”

我不知道这个“吐槽”的原因是否是因为我在talk开始时说了几句谦虚的话。但谦虚并不代表模棱两可。slide中的所有结论都是我思考后的结果,这种东西本身就是主观的,这又不是数学,需要有精密的证明过程。但我在表达这些观点时一直都是坚定的。不知道在这位gopher心中,萨丕尔-沃夫假说是否也算是模棱两可的结论呢?

我的确希望这个topic能作为一次“抛砖引玉”,让广大gopher一起深层次理解语言设计者的初衷以及go设计过程中的一些考虑和认知,能让我们更好的使用Go语言。你可以补充,可以针对某个观点反驳,但你要拿出你的思考过程。如果能说服我,说服大家,那我就认同。这次的分享就是我的思考过程,绝不是模棱两可。

小结

最后,十分感谢AstaXie,没有他就没有GopherChina!希望今后的GopherChina大会越办越好,希望Go基金会越做越大!

gopherchina 2017所有讲师的slide已经放出,可以在这里下载。

我个人的talk slide在这里可以下载。

img{512x368}
GopherChina会场周围的美丽景色

img{512x368}
与GopherChina mascot合影

img{512x368}
演讲中


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

GopherChina讲师专访

今年有幸收到GopherChina大会的组织者、beego开源项目的owner、《Go Web编程》的作者谢孟军童鞋的邀请,以讲师身份参加今年的GopherChina大会。下面是GopherChina对我这个讲师的专访稿^0^。该专访稿将同时被发布在公众号“Go中国(微信号:golangchina)”上面,可点击这里阅读。

1、首先介绍一下自己。

大家好!我叫白明(Tony Bai),目前是东软云科技的一名架构师,专职于服务端开发,日常工作主要使用Go语言。我算是国内较早接触Go语言的程序员兼Advocater了,平时在我的博客微博和微信公众号“iamtonybai”上经常发表一些关于Go语言的文章和Go生态圈内的信息。

在接触Go之前,我主要使用C语言开发电信领域的一些后端服务系统,拥有多年的电信领域产品研发和技术管理经验。我个人比较喜换钻研和分享技术,是《七周七语言》一书的译者之一,并且坚持写技术博客十余年。同时我也算是一个开源爱好者,也在github上分享过自己开发的几个小工具。

目前的主要研究领域包括:GoKubernetesDocker和儿童编程教育等。

2、回忆一下与Golang的渊源。是什么原因决定尝试Golang?自己用Go语言实现的第一个项目是什么?当时 Golang 有什么令人惊喜的表现,又有什么样的小不足,这个不足在Golang已经更新到1.8版本的时候是否已经得到改善?

众所周知,Go语言最初由Robert Griesemer, Ken ThompsonRob Pike在2007年末共同设计和实现,2009年11月份正式发布并开源,并于2012年3月份发布了1.0版本以及Go1规范。我就是在2012年开始接触Go的,那是缘于看到一份由Rob Pike主讲的3-day Go Course资料。从那份资料里,我了解到了Go的设计理念和Go语法。

由于之前浸淫于C语言多年,深知C语言在系统编程以及服务端编程方面的强大,同时也亲身体会到C的语法“陷阱”和C手工内存管理给开发者带来的苦恼。虽然那些年市面上也有其他主流语言可供选择,但在我看来,它们给我带来的心智负担太过沉重,比如:C++“宇宙无敌”的学习和使用复杂性、Java超大的资源消耗和庞大且纷繁芜杂的框架体系、动态语言(rubypython)无静态类型而导致运行时crash时调试的困难、函数式语言(如Haskellclisp)的过于小众和非主流。显然它们都不是我的菜。直到Go的出现,C程序员出身的我一下子就被这门新语言迷住了。

现在想起这件事来,我当时迷上Go应该主要由于以下几点原因:

* 静态类型语言、接近于C的性能(对于C程序员来说,这算是某种天然继承性)
* 简洁的语法
* 内置的并发支持
* GC
* 贯穿整个语言的正交设计和组合编程思路(兼容对OO的支持)
* 工具和功能全面的标准库

而且这几点也是这几年持续支撑我深入学习和使用Go语言的原因。

不过由于Go1刚出来时也十分小众,并且各方面功能还在完善中,我并没有在真实项目中使用Go,这种状况一直持续到2014年末。直到那时,我才在一个小项目中使用Go实现了一个微信公众号的协议接口。当时发现:使用Go实现一些安全协议真是非常方便,因为标准库里内置了很好的支持,比如:各种aes、sha256、tls算法实现。同时,Go内置的testing framework、gofmt、Go pprof工具的表现也是让我感觉用起来十分舒服。

如果非要说当时有什么不足之处的话,那只能是Go对debugging的支持明显不足。即便是到了目前最新的Go 1.8版本,Go在debugging方面虽然有所改善,但和C这样的传统语言来说依然有很大差距。不过好在我们有“print”这个无敌调试武器,Go的这个不足对我影响微乎甚微^0^。

当然随着Go在更多规模稍大项目的使用,Go的包管理问题逐渐浮出水面,这也是整个Go社区都想改进的事情。好在目前已经有了专门的Commitee来做这件事,最新的roadmap显示dep工具将在Go 1.10 dev cycle并入Go tools中。

3、2009年诞生至今,Go语言基本统治了云计算,作为最专业的Go语言专家,您认为这是由于它的哪些优雅的特性?Golang未来还会有什么样的改进和突破?

“作为最专业的Go语言专家”,这一称号的确不敢当。我觉得我个人只是国内Gopher普通一员,能为Go语言在国内的发展做点事情就很高兴了^0^。

Go自从1.5版本自举后,随着ssa优化、GC延迟优化的深入,Go在国内外的使用趋势确实是一片大好,尤其是Go问鼎2016年TIOBE编程语言排行榜的年度语言,让更多的程序员知道Go语言、了解Go语言和使用Go语言。在云计算成为当今IT行业常态的今天,Go在这方面已然成为一个重量级选手。从个人对Go的情感角度出发,我个人是希望Go语言能成为”21世纪的C语言”和云平台第一语言的。不过这是一个过程,需要时间,还需要依靠全世界Gopher和Go Community的共同努力才能实现的。

时代不同,语言的成长环境也有所不同。和上一代和两代的语言似乎有所不同,新一代编程语言是否能进入程序员们的法眼,是否值得程序员去投资,“背景”很重要,即所谓的编程语言也进入了“拼爹”时代。Go语言背靠Google这棵大树,又有Robert Griesemer, Ken Thompson, Rob Pike三巨头坐镇,是真正的“牛二代”,它自然就会得到不少程序员的青睐。我想这是Go吸引眼球的场外因素。

至于Go本身的语言特性,在上一个问题中,我已经做了初步阐述了,这里再补充几点:

* Go是一门以解决Google内部生产环境中的问题(大规模并发服务)为目标的、兼顾在语言设计层面解决一些软件工程问题的面向大规模并发服务的编程语言;
* 开发效率较高(对比主流的C、C++和Java),且执行效率与C相比,没有数量级级别的差异;
* 编译速度超快(相对其他需编译的主流语言),无需喝咖啡等待;
* Go1兼容性的承诺。

Go语言到目前已经演进到1.8版本,Go 1.9开发周期已经打开。今年夏天,Go 1.9发布后,Go似乎就到了版本演进的关键节点,是继续Go1兼容(Go 1.10、Go 1.11…),还是诞生Go2规范,目前并没有明确信息。不过未来的改进和突破,我觉得还是应该建立在Go语言设计的初衷和设计原则之上,这些初衷和原则包括:

目标:
 * 高效的静态编译语言
 * 动态语言的易用性
 * 类型安全和内存安全
 * 对并发和通信的良好支持
 * 高效、低/趋于零延迟的GC
 * 高速编译

原则:

 * 保持概念正交
 * 保持语法简单
 * 保持类型系统精炼,无type hierarchy

从这些年Go的发展来看,基本都是遵循以上目标和原则的。即便Go2出来,不符合上述原则的feature,也是很难加入到Go2里面的。

4、之前是否有关注到Gopher China大会,对大会的风格和内容有什么样的印象?

对于中国大陆地区规模最大,最具影响力的Go大会,我是从第一届就开始关注了,虽然第一届因故没能参加^0^。在去年举行的第二届大会,我是作为早鸟观众参与的哦。而本届则有幸成为讲师。

GopherChina从诞生至今,规模日益扩大,据说今年的参会人员可能突破1000人。而且GopherChina大会从第一届就汇聚了国内一线IT厂商的精英技术人员作为讲师,并得到了Go core team的大力支持。在每一届大会都会邀请到Go team中的核心开发人员参会布道,甚至在第一届大会时还邀请到了Go三巨头之一的Robert Griesemer,极大满足了国内Gopher的求知欲。

而且就我观察,每一届GopherChina大会的主题都涵盖:语言、工程、新兴领域应用等多个环节,颇具多样性和全面性。

5、作为讲师也是参会者,对于今年的Gopher China大会的哪些议题有所期待?

GopherChina每一届都是高手云集,这届也不例外。今年大会的每个议题都令我很是期待。

6、现在很多企业项目都在准备转Go,对于这些项目的负责人有没有建议和经验分享?

Go语言以极易上手著称,同时Go也是一门十分简单的语言(相对于其他主流语言),C、Cpp、Java、Python等程序员转型到Go的曲线并不陡峭,因此团队整体转型为Go的门槛并不高。但还是要有几点是项目负责人需要认真考虑的:

(1) 确认Go适合项目的应用场景

Go不是万能的,不能为了用Go而去用Go。但Go从最初定位为一门系统语言(Sytem Programming Language)逐渐演化成为一门通用语言(General Purpose Programming Language),说明其适应性和应用范围已经十分广泛,目前在云计算、Web开发、大数据、游戏、数据库、IDE、容器等领域均有大规模应用案例。但即便这样,仍然在有些领域的应用需要谨慎,比如嵌入式领域、比如mobile开发,虽然在这两个方面Go都做出了很大的努力,但似乎并没有较大的突破。

(2) 以终为始,从开始就参考Go的最佳实践

Go经过若干年的演化发展,逐渐形成了一些最佳实践,包括:项目代码组织、命名、惯用法、测试方法、错误处理、接口使用等。建议多看官方的talks、blog和世界范围内Go大会的presentation video。

(3) 单元测试全程保障

Go内置了单元测试框架,而单元测试是检验代码设计好坏的基础,也是代码重构的先决条件。建议项目从始至终都要优先考虑对代码编写测试代码。

(4) 充分利用标准库

在Go的应用实践中,你会发现Go标准库已经为你提供了大部分你要使用的功能。甚至有一些极端的Go纯粹主义者只愿意标准库中的函数和方法。Go标准库凝聚了Go team以及相关Contributor的Go代码精华,其稳定性绝对值得信赖。充分和广泛利用标准库也便于项目代码组织、构建和迁移。

(5) 基于go tool建立代码metric视图

对于那些性能敏感的系统,建议在内部环境基于go tool建立起代码的metric视图,监控代码变化给系统性能等带来的影响,利于问题诊断。

最后,请及时反馈Go语言自身问题,你的反馈是Go语言演化的动力

7、有没有你觉得很酷的Gopher?可以回答自己哟~

在github.com/golang/go上,我经常关注Russ Cox的代码。众所周知,Russ Cox是Go核心代码提交次数最多的member,他也除三巨头之外,对Go演化影响着最大的人之一。从近两年的Go team开发活动来看,Russ Cox开发效率很高,并且提出的proposal思维之缜密和全面令人叹服。

Dave Cheney是另一个我经常关注的Gopher,他也是第二届GopherChina大会的受邀讲师。他不遗余力的“鼓吹”Go,并从Go 1.6版本开始,发起了Go Global release party ,成为Go Community又一个节日。他不仅是Go community中的意见领袖,同时也为Go社区贡献不少有用的工具和思想,包括:gberrors等。

Dmitry Vyukov,前Intel Black Belt级工程师,现Google员工,虽然他不是专职Go team的人,但他却是Go scheduler当前版本的核心实现者。虽然近两年似乎在golang的投入并不是那么多,但依然成果丰硕,Go Execution Tracergo-fuzz(据说要加入go核心)都是他的杰作。


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats