【在主画面加入捷径】
       
【选择语系】
繁中 简中

技术杂谈:Go 的成功告诉我们什么?

【赞助商连结】

    Go 语言在 2009 年问世,在短短不到 10 年的时间,已经侪身各大语言排名的主流语言区。Ruby 的发明者松本行弘曾说过,一个语言生态圈的培养,需要至少十年的时间;以这个标准来看,Go 语言的成长可说是相当迅速。然而,Go 的语法特性其实不是很优秀,像是缺乏继承、泛型、函式重载、运算符重载、枚举等现代语言常见的特性;基本上,大概只到 Java 1.4 版的水准。Go 所编译的程序也不是编译语言中最快的,大概和 Java 同级,但还输 C++ 一些。就如同世界上其他的事物,程序语言的成功,就是需求和一些些机运。

    一些程序语言理论的书会教我们什么是良好的程序语言,像是易学易写、执行速度快、标准化、开放源代码等等;对照一些成功的程序语言,我们虽然不能说这些原则是 bullshit,但也是做为参考就好。JavaScript 除了是网页前端必备的语言外,还扩展到网页后端、桌面程序、行动程序、IoT 等,就是一个典型的成功例子;但 JavaScript 的坑坑洞洞从来也没少过,笔者先前在这里也有谈过,有兴趣的读者可以前往一读。相较之下,Dart 虽然在技术层面上是正确的,却败在各大浏览器供应商间的角力,相当可惜 (可看这里)。

    程序代码是程序设计者将想法转为可执行的电脑程序所需的中间媒介,除了一些工程上的理由,程序代码的主要目的还是要转成可用的程序,而不是像文学作品般拿来拜读。就像其他的产品,使用者其实不会区分某个网站背后跑的是 PHP、Python、Node (JavaScript) 还是 Go,还是看网站本身是否顺畅好用。对于程序设计者来说,我们也不需要和程序语言结婚,一生一世、至死不渝,按照需求选择所需的工具即可。同样地,语法特性只是撰写程序时会用到的一些性质,不会某个程序只能用某个语言撰写,如果缺乏某样特性,通常可以用其他 (稍微笨一点的) 方法替代。

    观察一下 Go 成功的使用案例,就会发现大部分集中在网页后端、云端运算、服务器程序、微服务等重叠的领域。从 Go 内建对共时性的支援和其标准函式库所提供的功能,可以发现到 Go 团队的确相当关注这方面的应用。相较起来,Go 团队对其他领域大概就不感兴趣,像是 Go 并没有官方的 GUI函数库,行动程序相关的套件发展得很慢,科学运算也是放任社群自行努力。笔者觉得这样子并没有什么对错,如果 Google 本身不需要这些功能,发展这些功能只是在消耗公司的经费;反正 Go 本身也开放给社群,有这方面需求的团队自然会去发展相关的套件。

    实际把玩 Go 一阵子,会发现 Go 的确是相当适合工程师的玩具。像是 Go 的项目不需要额外的设定档,某种程度上简化了项目管理的过程。Go 的程序代码可自动整理,有助于项目风格的统一,对多人合作的确有一些帮助。Go 项目编译快速,缩短了开发时程。Go 程序代码易学易写,在易用性及执行效率上取得不错的平衡。

    当然,Go 缺乏很多语法特性,有时候程序代码会比较长;甚至在语言本身也输自家的 Dart。如果将 Go 和其他语言比较,会发现 Go 的思维比较接近 C 和 Java,就是程序代码要详细 (verbose)、清楚,尽量地减少内隐守则等黑魔法。对语言来说,verbose 似乎不是好的评语;但在程序代码中大量地使用一些捷径,程序设计者需要记忆很多特性,反而使程序代码难读,对于后续程序的维护是不利的,像是 Perl 就是一个易写难读的实例。

    网页后端是至少 40 年以上的老议题,但是 Go 仍然可以在这个领域取得成功。虽然 Google 这块金招牌会有一些号召力,但仍然要靠 Go 良好的特质才能持续吸引使用者 (看看隔壁的 Dart)。成熟的市场通常很难进入,但重点是把握自家产品的特质,做出市场差异,而不是一味地 costdown、杀到红海。

    【赞助商连结】