大概每个开发者都应该认为自己使用的语言是世界上最好的语言。这都是相对的。每个人应该都不一样。众所周知,知乎在几年前就将推荐系统从Python切换到了Go。于是乎,就有人说Go比Python好,Go和Python两大社区的相关开发者也为此争论不休,似乎没有人能完全说服对方。知道从Python切换到Go意味着Go比Python更好吗?我认为各有各的优势,谁也替代不了,而且会长期共存!“从Python到Go,说明Go优于Python”完全是一种片面的理解。“语言至上”解决不了业务问题,Go也好,Java也好。Go的优点是文件部署方便,协程机制比较成熟简单,静态编译语言效率高,编程模型比较简单。这大概就是越来越多的公司尝试Go的原因。除了知乎,哔哩哔哩也将自己的核心组件从PHP转移到了Go。此外,BAT等互联网巨头在其内部系统中也采用了Go语言。这是否意味着Python和PHP已死?当然不是也不应该这样。如果你想坚持使用Python和PHP,那是没有问题的。一个系统如果沉淀时间过长,就会产生很多大大小小的零散的“技术债”,这涉及到解决成本的考虑,重构、重写,还是重新设计核心模块或新模块?由此引出技术选择的问题。还有Python和PHP人才储备的问题,以及团队想要尝试新技术的考虑。这些问题交织在一起,并不是编程语言好坏那么简单。所以我们还是要回到业务层面去看技术方案。不得不说,Go的协程,一个“go”就能解决大部分问题。写代码确实很简单。Python中新加入的asyncio还是比较复杂的,在Future、Task等方面还是有很多实现方式的。因此,技术永远只有对的,没有最好的,也没有好坏之分。相信如果团队在Python方面有扎实的积累,并且热衷于专注于Python,选择Python应该是大概率事件。Python现在已经被广泛使用,尤其是在AI领域的推动下。Python人才找工作没有以前那么难了。难道知乎也面临着人才流动的压力?另外,毕竟Python的生态,在这么多的编程语言中,算是最好的之一了。虽然Go很流行,但在社区方面可能不如Python和PHP。这也是一个现实的问题。知道前端改成React了,感觉没比原来的AngularJS好,但也不能说React不好。尝试在Go中编写一些原始的Python作用域也是如此。而且,一个系统同时应用多种开发语言和一系列技术栈也是很正常的。Python有自己的场景,不会被完全取代。担心太多了。反正都是“增删改查”!至于为什么选择Go,有内部工程师透露,选择Go不是一个人的选择。是一个决定,而是整个团队深思熟虑的结果!众所周知,知乎社区后台的主要编程语言是Python。随着知乎用户的快速增长和业务复杂度的不断增加,核心业务的流量在过去的一年里增长了数倍,对应服务器的压力也越来越大。随着业务的发展,我们发现Python作为一种动态解释型语言,逐渐暴露出运行效率低、维护成本高的问题:运行效率低下。知道目前机房机房空间不足,按照目前用户和流量的增长速度,可以预见服务器资源短期内告急(为此,知乎正在从单一机房结构升级为不同地方的多活动结构);Python太灵活得益于近年来开源社区的发展和容器等关键技术的普及,知乎的基础平台技术选型一直比较开放。基于开放标准,每种语言都有成熟的开源中间件可供选择。这样可以让业务根据问题场景选择更合适的工具,语言也是一样的。基于此,为了解决动态语言的资源占用和维护成本问题,我们决定尝试使用静态语言对资源占用高的核心业务进行重构。为什么选择高朗?上文提到,知乎在后端技术的选择上是比较开放的。过去几年,知乎除了以Python为主要语言开发外,内部还有Java、Golang、NodeJS、Rust等语言开发的项目。Golang是当时知乎内部讨论交流最活跃的编程语言之一。考虑到以下几点,知乎决定尝试使用Golang重构其内部高并发核心业务:天然并发优势,特别适合IO密集型应用知乎Golang版本内部基础组件生态较为完善。静态类型,多人协同开发维护更安全可靠。构建后只需要一个可执行文件,部署方便,学习成本低,开发效率不明显低于Python。优秀的候选语言——Java,Golang在了解内部生态环境、部署的便利性、工程师的兴趣等方面更胜一筹。最终,我们决定选择Golang作为开发语言。最后做一个简单的总结:第一,重构语言的选择要结合公司的技术背景和业务场景;第二,架构要尽可能的灵活,迭代;三是监测要及早开展,尽量做到低层次、泛化。
