云计算时代,我与Go语言难解的缘分

文/许式伟

我在新浪微博、《Go语言编程》一书中下了一个论断:Go语言将超过C、Java,成为未来十年最流行的语言。

我曾在2007年第2届ECUG大会上提到了我对未来软件产业趋势的判断:存储与计算将向服务端转移;PC单机转换为强悍的服务器+多元化的终端。这个趋势判断对我的职业生涯其实影响非常重大。

从业务角度讲,正因为这个判断,促使我选择成立金山实验室研究云存储技术;也促使我关注Erlang这门面向分布式编程的领域性语言;促使我举办了一届届的ECUG大会;促使我加入盛大创新院,发起祥云计划(盛大云前
身),做盛大网盘;促使我们成立了七牛,有了七牛云存储。

从技术角度来讲,它促使我放弃了近10年的桌面开发经验,转向服务端开发。正如我在《我为什么选择了Erlang》中建议的那样:

  • 要么不写程序,要么就写服务器端程序;
  • 当然,你也可以去撰写移动终端设备上的代码,在PC平台上做开发的空间很小。

在金山实验室时,我选择了Java语言,并积极关注Erlang语言,对其进行小范围试用,以及大规模使用的可行性评估。我的结论是:

  • Erlang风格的并行思想真的很棒;
  • Erlang语言优势与劣势同样明显,这门语言不适合规模化推广使用。

Erlang的困难之处在于它是FP语言。我们缺乏深入人心的FP编程理论。我们并不了解FP“数据结构”学。这是Erlang语言无法逾越的门槛,决定了它只能是小众化语言。

进入盛大创新院后,我选择了C++,原因是我个人更喜欢C++,而对Java的设计哲学非常不感兴趣。出于对Erlang风格的并行思想的喜爱,我创建了一个名为CERL的项目,取义Erlang Model for C++,表明我希望能够把Erlang那一套并行编程模型搬到 C++中来,降低分布式编程的负担。

接触Go语言后,我发现CERL 2.0的并发编程模型,其实就是一个雏形版的Go语言并发模型,两者从理念上来说完全一致。

七牛公司成立于2011年5月底,我们选择了Go语言作为七牛云存储服务端的主体语言。当时Go语言甚至语法都还没完全稳定下来。为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来十年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,处处带给我惊喜。

Go语言给我的第一个意外惊喜,是接口。当然,我意外的不是Go的非侵入式接口。在接口(或契约)的表达上,我一直认为Java和C#这些主流的静态类型语言都走错了方向。C++的模板尽管机制复杂,但走在了正确的方向上。但Go语言的接口远不是非侵入式接口那么简单,它是Go语言类型系统的纲。除了支持反射等高级特性外,Go语言还支持接口查询。

Go语言给我的第二个意外惊喜,是极度简化但完备的“面向对象编程”方法。Go语言废弃大量的OOP特性,如继承、构造/析构函数、虚函数、函数重载、默认参数等;简化的符号访问权限控制、将隐藏的this指针改为显式定义的receiver对象。让我看到了OOP编程核心价值原来如此简单—只是多数人都无法看透。

Go语言带给我的第三个惊喜,是它的函数多反回值和错误处理规范。函数多返回值比较容易想到,只有这样函数的输入输出才能清晰呈现,语义表达上才会足够清晰。不过让我没想到的是,Go引入了内置的error类型以及defer关键字来编写异常安全代码,让人拍案叫绝。

Go语言带给我的第四个惊喜,是它功能的内聚。一个最典型的案例是Go语言的组合功能。对于多数语言来说,组合只是形成复合类型的基本手段。但Go语言引入了匿名组合的概念,让其他语言原本需要引入继承甚至虚拟继承这样晦涩概念来完成的事情,统一到了组合这样的一个基础上。

Go语言带给我的第五个惊喜,是消除了堆与栈的边界。在Go语言之前,程序员是清楚地知道哪些变量在栈上,哪些变量在堆上。堆与栈是基于现代计算机系统的基础工作模型上形成的概念,Go语言屏蔽了变量定义在堆还是栈上这样的物理结构,相当于封装了一个新的计算机工作模型。这一点看似与Go语言显式表达的设计哲学不太一致,但我认为这是一项了不起的工作,且与Go语言的显式表达并不矛盾。Go语言强调的是对开发者的程序逻辑(语义)的显式表达,而非对计算机硬件结构的显示表达。对计算机硬件结构的高度抽象,将更有助于Go语言适应计算机硬件发展的变化。

Go语言带给我的第六个惊喜,是Go语言对C语言的支持。可以这么说,Go语言是除了Objective-C、C++这两门以兼容C为基础目标的语言外的所有语言中,对C语言支持最友善的一个。什么语言可以直接嵌入C代码?没有,除了Go。什么语言可以无缝调用C函数?没有,除了Go。对C语言的完美支持,是Go快速崛起的关键支撑。还有比C语言更让人觊觎的社区财富吗?那是一个取之不尽的金矿。

在《Go语言编程》一书的前言中,我谈到Go语言的基础哲学来源于C语言,而不是像Java、C#那样,学的是C++。C语言的成功在于它足够简单,所以Go语言也要非常简单。Go语言的定位就是成为互联网时代的C语言。本质上来说,Go语言的特性都围绕着以下设计哲学:

  • 大道至简,显式表达。任何封装都是有漏洞的。最佳的表达方式就是最直白的表达方式,不试图去做任何包装。
  • 最少特性原则。如果一个功能不对解决任何问题有显著价值,那么就不提供。

尽管是40年来出现的语言非常之多,但我认为,谈得上突破了C语言思想,将编程理念提高到一个新高度的,仅有Go语言而已。

Go语言是一门变革性的语言,要革的是C的命(顺便革Java的命)。Go语言很简单,但具备极强的表现力。从目前的状态来说,Go语言主要关注服务器领域的开发,但这不是Go语言的完整使命。

我们说Go语言适合服务端开发,仅是因为它的标准库支持方面,目前是向服务端开发倾斜:

  • 网络库(包括 Socket、HTTP、RPC 等);
  • 编码库(包括 JSON、XML、GOB等);
  • 加密库(各种加密算法、摘要算法);
  • Web(包括 Template、HTML支持)。

而作为桌面开发的常规组件GDI和UI系统与事件处理,基本没有涉及。

总之,我认为,Go语言将引领未来10年IT产业的发展。在最初5年内,Go语言会在服务器端编程上大放异彩,而桌面端的开发则仍然处于探索和完善期,预计在后5年才趋于成熟,成为各种手持设备上的主流开发语言之一。

作者许式伟,七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPS Office 2005首席架构师。开源爱好者,发布过包括WINX、TPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计哲学所倾倒。七牛云存储是国内第一个吃螃蟹的团队,核心服务完全采用Go语言实现。

comments powered by Disqus