写了50万行Go代码是一种什么样的体验?
大家好,我是 polarisxu。
今天看到一篇文章:看看写了 50 万行代码的 Gopher 对 Go 有什么感想。我对其中的核心内容进行整理,分享给大家!
先简单介绍下可汗学院(Khan Academy)。
这是一个非营利性组织,其使命是在任何地方为任何人提供免费的、世界级的教育。
全球有 6.17 亿儿童缺乏基本的数学和阅读技能。可汗学院是一个提供他们所需教育的非营利组织,因此需要大家的帮助,你的帮忙可以改变一个孩子的一生。
所以,从网站介绍可以看出,这个组织主要靠大家的赞助维持运营。如果你支持这样的公益事业,可以到官网:https://www.khanacademy.org/ 赞助。
从 Python2 迁移到 Go
可汗学院的项目 Goliath,最开始使用 Python2 实现的,2019 年逐步将其迁移到了 Go。这里有一篇文章介绍了迁移的事情:https://blog.khanacademy.org/go-services-one-goliath-project/。
因为这个决定,现在可汗学院所有的后端和全栈工程师都开始写 Go 代码,经过几年的积累,该项目跨域了一个巨大的里程碑:有超过 50 万行 Go 代码在线上运行着。这对于 Go 整个社区来说也是一件好事。
工程师很喜欢 Go
可汗学院的工程师们普遍认为「Go 很容易写和读」,用 Go 越多就越喜欢它。
一个有多年 .NET 经验的工程师说,Go 的错误处理和 .NET 的异常处理很不一样。虽然经常要处理 error,但如果一个函数没有返回错误,那可以确定它一定成功了,这一点还是很棒的。
此外,他们对 Go 的工具链很喜欢。比如通过 go doc 可以查找标准库的文档,特别方便。gofmt 让代码格式都一直,很适合阅读代码。虽然 Go Module 在社区抱怨的声音不少,但相比之前来说,还是有很大进步,而且可汗学院在使用过程中没有什么特别差的体验。
同时,他们很喜欢 Go 的编译速度,那叫一个快!
泛型,还是需要的
虽然大部分时候,并不需要泛型。但有时候,特别是是在写内部库时,尤其涉及到 slice 时,明显得感觉到需要泛型。
没有泛型是目前社区对 Go 抱怨最多的(虽然也有人说不需要泛型,有泛型了就不用 Go 了。。。),目前 Go 团队花了大量的时间在推进泛型。目前已经可以尝鲜,预计泛型会在 1.18 正式发布。
他们在迁移 Python 代码时,有些 Python 的语言结构,使用 Go 实现需要花费较多时间。不过,Go 的语言特性少,使得代码更一致,可读性更好。就他们的系统,有些特性,需要 2.7 倍的 Go 代码实现同样功能的 Python 代码。注意,是部分功能。
习惯了 Python 的人,他们希望 Go 中能够有更多的高阶函数。随着泛型的加入,这方面可能会加强,比如计划增加的 slices 包。
性能和并发性
相比 Python,发现 Go 的性能非常优秀。尽管迁移过程中,有点直接从 Python 翻译到 Go 的感觉,没有对 Go 代码做专门优化,但性能表现依然抢眼。优化后会有更好的表现。
其中一名工程师发现,Python 版本中,某些批量数据更改每小时会产生大约 100 个 Google Cloud Datastore 竞争警告,而在 Go 版本中,竞争警告接近于零,因为它处理数据的速度要快得多。他们有一个包含 1000 名学生的课程,在 Python 中加载需要 28 秒,而在 Go 中只需要 4 秒。
虽然他们的 Python 版本时候单线程的,但 Go 版本还是使用了并发的特性。
Go 官方一般推荐使用 Goroutine + Channel,但可汗学院发现,他们使用 sync 包的数量远超 channel,不知道这种情况将来会不会改变。
50 万行代码后的总结
一般来说,实现同样的功能,Go 代码会比 Python 多; 但 Go 的速度快,工具好用,而且在线上运行稳定、良好;
虽然可汗学院的工程师有不同的背景,对 Go 和其他语言也有不同的看法。经过这段时间的磨合,目前看,对 Go 他们还算满意。
你写了多少 Go 代码?你对 Go 的感受是什么?
推荐阅读