我曾在2007年第2届ECUG大会上提到了我对未来软件产业趋势的判断:存储与计算将向服务端转移;PC单机转换为强悍的服务器+多元化的终端。这个趋势判断对我的职业生涯其实影响非常重大。
从技术角度来讲,它促使我放弃了近10年的桌面开发经验,转向服务端开发。正如我在《我为什么选择了Erlang》中建议的那样:
- 要么不写程序,要么就写服务器端程序;
- 当然,你也可以去撰写移动终端设备上的代码(在PC平台上做开发的空间很小)。
为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来十年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,处处带给我惊喜。
1. Go语言给我的第一个意外惊喜,是接口。
当然,我意外的不是Go的非侵入式接口。在接口(或契约)的表达上,我一直认为Java和C#这些主流的静 态类型语言都走错了方向。C++的模板尽管机制复杂,但走在了正确的方向上。但Go语言的接口远不是非侵入式接口那么简单,它是Go语言类型系统的纲。除 了支持反射等高级特性外,Go语言还支持接口查询。
2. Go语言给我的第二个意外惊喜,是极度简化但完备的“面向对象编程”方法。
Go语言废弃大量的OOP特性,如继承、构造/析构函数、虚函数、函数重 载、默认参数等;简化的符号访问权限控制、将隐藏的this指针改为显式定义的receiver对象。让我看到了OOP编程核心价值原来如此简单—只是多 数人都无法看透。
3. Go语言带给我的第三个惊喜,是它的函数多反回值和错误处理规范。
函数多返回值比较容易想到,只有这样函数的输入输出才能清晰呈现,语义表达上才会足够清晰。不过让我没想到的是,Go引入了内置的error类型以及defer关键字来编写异常安全代码,让人拍案叫绝。
4. Go语言带给我的第四个惊喜,是它功能的内聚。
一个最典型的案例是Go语言的组合功能。对于多数语言来说,组合只是形成复合类型的基本手段。但Go 语言引入了匿名组合的概念,让其他语言原本需要引入继承甚至虚拟继承这样晦涩概念来完成的事情,统一到了组合这样的一个基础上。
5. Go语言带给我的第五个惊喜,是消除了堆与栈的边界。
在Go语言之前,程序员是清楚地知道哪些变量在栈上,哪些变量在堆上。堆与栈是基于现代计算机 系统的基础工作模型上形成的概念,Go语言屏蔽了变量定义在堆还是栈上这样的物理结构,相当于封装了一个新的计算机工作模型。这一点看似与Go语言显式表 达的设计哲学不太一致,但我认为这是一项了不起的工作,且与Go语言的显式表达并不矛盾。Go语言强调的是对开发者的程序逻辑(语义)的显式表达,而非对 计算机硬件结构的显示表达。对计算机硬件结构的高度抽象,将更有助于Go语言适应计算机硬件发展的变化。
6. Go语言带给我的第六个惊喜,是Go语言对C语言的支持。
可以这么说,Go语言是除了Objective-C、C++这两门以兼容C为基础目标的语 言外的所有语言中,对C语言支持最友善的一个。什么语言可以直接嵌入C代码?没有,除了Go。什么语言可以无缝调用C函数?没有,除了Go。对C语言的完 美支持,是Go快速崛起的关键支撑。还有比C语言更让人觊觎的社区财富吗?那是一个取之不尽的金矿。
我谈到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年才趋于成熟,成为各种手持设备上的主流开发语言之一。