首页 文章详情

知乎问答:为什么字节跳动选择使用 Go 语言?

Go语言精选 | 2990 2021-01-26 09:11 0 0 0
UniSMS (合一短信)

点击上方蓝色“Go语言中文网”关注,每天一起学 Go

这是知乎上看到的一个问答,有知道内幕的欢迎交流。

该提问者说:之前一直是听说字节跳动使用 Python 语言作为开发的主要语言,今年(2019 年)秋招实验室去字节跳动的几个同学分属于不同部门,被告知使用 Go 语言。问题见:https://www.zhihu.com/question/353085825。

这里选取几个回答,主要探讨选 Go 语言可能的考虑。


黄魏

得看业务需求吧,我们也是 py 转 go。py 写起来效率极高,不过对我们业务而言,有几个敏感的问题,GIL 对多核不友好,高并发和 cpu 密集情况下必须得从架构层面去设计了,另外考虑健壮性,动态语言做不到高覆盖率或有较强 code review 把控的话,业务极易有疏漏的地方,当然通过 try catch 和线上函数替换实现热修能缓解一些焦虑,但总归不是能体现在研发流程中的常规路数。

换 go 后,发现开发效率也不低,而且因为编译时的 error 能有效提醒开发人员得注意,对于无需考虑架构的地方,横向加大核数就能轻易获得性能上的好处。另外去看看 gopher 生态圈就能发现一大帮人都在使用 k8s,再结合云原生等生态上的能力,对架构和部署是有很大的优势。包括 go 的 pprof 等工具和 test,benchmark 等套件,可以让开发者较为容易的推进 profile 和 coverage 相关方面的实践,对于工程上的意义是巨大的。

反向的问题,为何不接受 golang 来作为服务器开发语言呢?

看评论,补充一些:

我们是游戏业务,gopher2020 游族有个分享,里面有几个语言的对比考虑,可以参考下。关于语言,大家都是好语言 ,不因以特性或者基因论来强调语言优越性,应该考虑的是否合适于业务和容易解决研发痛点。我们依然有大量的 py 应用,包括用 pyqt 来写编辑器等工具,日常的一些小脚本也特别适合 py 来做。

举个例子,我们有对 log 日志进行解析的小工具,py 在少量 log 时运行良好,但量级上来后开始用 multiprocessing 库进行改造优化,外加 pool 池约束,当然少不了还有进程间同步。用 go 重构就没这么多弯弯绕绕的事了。写个小工具而已,何苦为难自己。

都说 go 是 py 的替代者,从使用感受上确实如此。当然 py 的生态足够大,go 在这方面还比较稚嫩。但也有看到像七牛实现的 goplus 在挖 py 科学计算的墙角 。开源方面 go 还有好多轮子可以造,国人的参与度和热情都比较高涨,这可是个建功立业的好机会啊!

宋玄宾

非官方,我猜测原因如下:

  1. 因为需要高并发和分布式。字节的服务端有高并发量(几亿用户)、分布式服务以及大 io 吞吐(视频类内容)的需求,Go 的原生并发、适合分布式开发等特性比较适合这类场景;
  2. 因为需要高效率。诞生于 Google 研发环境下的 Go 语言,内置原生而且严格的代码格式化,并非常强调语法的简洁明了。这种特性被少部分开发者认为是死板,其实要是说这种设计背后除了哲学和美学上的意图之外,还有某种具体实用目的的话,那么它针对的就是在大规模人员参与开发时的场景——对于字节跳动这种规模(把人员招聘当 KPI)的开发团队来说,采用 Go 可以减少很多内部沟通成本以及实现方法方面的分歧;
  3. 包容性。现代软件大都非常复杂,大型软件通常都不止一种技术栈,也不止一个开发语言。Go 作为一个开发语言的晚辈,同时由于其背后的几位创始人来自于 Plan9 以及 Unix 系统这个 Old School 的背景,因此它带有一种顺应现代软件开发的包容性——既强调先进又不失保守。这除了体现在对各种协议的尊重、保留和兼容之外(Plan9 的教训),还具体体现在它被应用在容器技术这种“服务于其他开发环境的环境”这种场景方面;
  4. 探索。字节跳动这样有技术野心的公司,内部会有各种个样的技术探索和尝试,比如我就接触过他们一些人工智能方面的团队,使用的是 C、C++来开发(这也是该领域比较普遍的)。又比如各种移动端、桌面端的适配,肯定又不是 Go 所擅长的领域,技术栈也是五花八门。可想而知当初他们做这块的技术选型(转型?)也是要经历内部各种争论的,在争论中“选择 Golang”这方面声音占据了优势,我个人觉得说明他们还是蛮具有探索精神的,毕竟 Go 才诞生 10 个年头。
  5. 文化。开发语言的选型除了工程需要之外,背后多少还是有文化在里面的。选型 Go 说明字节团队基本上技术栈都是 C 系语言而且与 C 系文化有认同(这个不奇怪,C 系家族太大了);对 Unix 文化比较认可;对 Google 的工程文化比较认可等等。

mathfinder

因为微服务架构的流行,GO 语言在各个公司开始有一定的应用。

微服务架构,简单而言:利用模块化的方式把一个个轻量的专注于某个小功能的服务组合出复杂的大型应用程序。组合过程往往需要一个枢纽服务把各个服务串起来。起到枢纽作用的服务,需要完成高效的任务分发及结果消费,往往要求程序高并发、安全、可靠、稳定易于维护。

而 GO 语言则为并发而生:

  1. 异步编程复杂度低,易维护:一般而言写异步程序相比同步程序复杂度要大个量级。由于 GO 语言中 Channel 设计,异步程序写起来非常自然,不用各种挂锁,维护起来也不糟心。
  2. 并发效率高:跟 Python 相比不在一个量级。
  3. 语法检查严格,高安全性。

相比之下,逻辑简单异步程序,使用 Python 还可以轻松完成。复杂一点的,写的过程中大概率数据流得堵个半天,费老大劲把数据流整通了,然后感觉各种安全隐患没吃豹子胆也不敢上。哪天一个异常请求把服务打挂了,就人在家中躺,锅从天上来了。

综上,轻巧的微服务可以选择 Python,高并发服务高优选择 GO。此外,GO 语言的设计理念很先进,学习过程中编程思想也得到一定的开阔。

半桶水

因为一鸣不喜欢 java,所以开始是 python,python 扛不住了,自然就用 go 了。

rpb

抖音等业务主要依赖离线或近实时服务,且这些服务中包含很多 AI 服务需专业团队维护,因此适合拆成低粒度微服务松耦合架构,同时组织上形成 data,lab,infra 等中台部门和抖音、西瓜、头条、tt 等业务部门。这种架构适合用 go 写 gateway 和非计算密集的业务代码,用 c++写计算密集的中台服务。

业务代码为什么不用 java 呢?因为草创之初就用 java 想要达到阿里的成熟度很难,大量中间件需要重新制造,不如用 go 有完善的标准库。字节的人才结构偏年轻,高薪招聘的优秀 new graduate 可以非常好地适应 go 写业务逻辑,而用 java 的话说实话还是需要一点经验积累的,学历智力差一点的社招反而更胜任。

字节和阿里的场景是完全不同的,在电商业务发展之前是没有实时性,一致性和并发要求都高的服务的,也就不需要搞一套复杂的 java 的业务架构,做双十一的自动扩容和隔离,以及延迟二阶段提交等。复杂度低的业务用 go 写起来足以应付。真正困难的部分反正有专家团队用 Python 写原型,用 C++写核心服务。


还有其他一些有意思的回答不一一列举了,有兴趣的可以去看看:https://www.zhihu.com/question/353085825,阅读原文可以直达!

有在字节经历过选型的朋友吗?欢迎留言透露下?!



推荐阅读


福利
我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

89759726988a695841963bc1683ef987.webp

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter