文/王垠
当我嘲笑 Go 语言的时候,有些人跟我说,你说 Go 语言是垃圾,可是你看像 Docker 和 Kubernetes 之类的云计算项目,为什么是 Go 语言写的呢?
其实答案很简单:这些东西并不是非得用 Go 语言写才可以,用其他语言实现它们其实并没有什么问题,只不过它们碰巧是用 Go 语言写的而已。Docker 和 Kubernetes 之类的项目,其实只依赖于操作系统的构架细节,对语言没有特别的要求,而且也没什么性能需求,所以它们其实可以用任何语言(包括 Shell,Perl,Python,Ruby,C,Java……)来实现。只因为有人跟风,用 Go 语言写了这些东西,并不能说明 Go 语言是好东西。在当今混乱的 IT 业界,随便你做个东西都会有人拿来用,更不要说是挂着 Go-ogle 的羊头的语(go)言(rou) ;)
如果你不相信我,可以看看这个叫“Bocker”的项目,它只用了 100 行 shell script,就实现了 Docker 最重要的功能。 说白了,Docker 的原理就是建立一些目录,把系统文件和相关库代码拷贝进去,然后 chroot,这样你的代码在里面运行的时候,就以为自己独占一个 Linux 系统。Shell 语言之恶劣,我已经有专文介绍,所以就不多说了。本来可以用 shell 脚本实现的项目,现在有人用 Go 来做,能说明 Go 是一个好的语言吗?
另外也许很多人不知道的是,Docker 和 Kubernetes,虽然很火,但其实并不是什么了不起的技术。Docker 并不能解决 Unix 的根本问题。Unix 从来就不是一个具有良好模块化设计的系统。各种稀奇古怪的配置文件,设计缺乏条理和章法。各种模块之间,版本逻辑依赖关系错综复杂,纠缠不清。所以不管你事后怎么补救,其实都难以变成结构清晰的设计。很多项目做成了 container 之后,它们之间用 REST 和 HTTP 进行通信,其实让系统模块之间的通信变得更加困难和复杂。
使用了 Docker 之后,你也许会发现,Unix 的狂热分子们其实重新折腾出了 Windows 一开头就有的应用程序构架,然而这些应用程序之间的通信方式,却远远没有达到 COM 和.NET 的成熟程度。