GMTC深圳站售票最后一周,点击查看最新日程>> 了解详情
写点什么

从 Python 2 迁移到 Go:虽然代码量多,但太香了

  • 2021 年 5 月 21 日
  • 本文字数:1845 字

    阅读完需:约 6 分钟

从Python 2迁移到Go:虽然代码量多,但太香了

我第一次写 Goliath 项目是在 2019 年 12 月,当时,可汗学院(Khan Academy)把我们的后端从 Python 2 整体迁移到了用 Go 编写的服务上,还有一些必要的改变来实现这个过程。同时,我也写了一些关于我们是如何逐步实现这种变化 (https://blog.khanacademy.org/incremental-rewrites-with-graphql/?fileGuid=eQ1DBjkIh1Ef1HpE) 的。


Goliath 项目介绍:https://blog.khanacademy.org/go-services-one-goliath-project/?fileGuid=eQ1DBjkIh1Ef1HpE


在我们开始 Goliath 项目时,团队中并没有人知道 Go 语言,只是通过实验来验证 Go 比其他选择更好。现在,我们所有的后端和全栈工程师都在编写 Go 代码,对 Goliath 的增量交付让我们跨过了重要的里程碑。目前,已有 50 多万行的 Go 代码投入生产。看来现在正是对 Go 自身进行反思的好时机。

我们的工程师喜爱 Go 语言


我咨询了工程师们对 Go 语言的一些开放式回答,得到的反馈是:“Go 语言很容易读写”,“Go 语言,我越用越喜欢!”


一位在 .NET 领域工作多年的工程师,重视异常风格的错误处理,这与 Go 的错误处理非常不同。如果你不熟悉这个主题,那么 Go 的错误 是指从可能存在错误条件的函数中返回的值。我们以前的 .NET 工程师现在说,“能够调用一个没有返回错误的函数,并且确信它一定会成功,这是非常棒的。”


另一位工程师引用了 Go 的 标准库文档。他喜欢“通过例如 Go 文档的 io.Writer 进行无网络浏览。满分的最佳文档,将会再次阅读”。


总的说来, Go 的工具非常出色。编译速度很快,格式化也是标准工具链的一部分,可以帮助消除大多数关于格式化的讨论。尽管我在网上还看到一些关于 Go 模块的抱怨,但是它们比 Go 之前的软件包管理方法更好,而且从我们的经验来看,在这方面是非常好的。我们在为需要完成的事情寻找工具和库时也没有遇到任何麻烦,比如 gqlgen。

我们想要泛型,否则 Go 有点冗长


多数情况下,不使用泛型来编写 Go 代码不会有问题。大部分时候,当我们编写内部库代码,甚至仅仅是处理 slice 时,我们都会感到它们并不存在。


缺少泛型是人们对 Go 的最大抱怨。Go 团队花时间制作适合 Go 的泛型,我所调查的工程师们都对此表示赞赏,并对这项工作的进展感到兴奋。至少我们在使用 Go 的几年后才会发布它们。


当移植 Python 代码时,一位工程师注意到,Go 中的某些语言结构需要更多的努力才能写出代码,但是 Go 相对较少的语言特性使得代码更加一致,读取速度更快。在系统的某一部分中,我们需要 2.7 倍的 Go 语言代码来处理与 Python 代码相同的特性,尽管其中一部分是由于某些函数调用被跨服务查询所替代。


另一位工程师希望能够更好地使用高阶函数,而所提出的 slice 包 似乎就是对这些思路的很好补充。归根结底,我们希望能少写一些代码,而我们通过泛型所获得的选择将有助于实现这一目标。

性能和并发性


通过 Python(Python 2,也不少),我们发现 Go 的性能非常出色。在最终实现与 Go 相似的功能时,我们将尽可能地从 Python 向 Go 进行复刻级的移植,而不是看起来像 Python-in-Go 的代码。除了真正的回归外,在这个过程中,我们并没有对性能工作确定优先级。


一位工程师指出,在 Python 版本中,某些大量的数据变化曾经每小时产生约 100 个谷歌云数据存储(Google Cloud Datastore)争用警告,而在 Go 版本中几乎没有发生这种情况,因为它在处理数据方面要快得多。我们有一个包含 1000 名学生的类的异常案例,在 Python 中可能需要 28 秒的时间来加载,但在 Go 中只需要 4 秒。


尽管我们是从大多数单线程 Python 中直接移植过来的,但是我们确实使用了 Go 的并发特性。一位工程师指出,虽然通道是 Go 最引人注目的特性之一,但是我们使用同步包的特性比通道更多。

编写 50 万行 Go 代码后的感想


总结一下:


Go 通常比 Python 更冗长。

但我们很喜欢!它的速度很快,工具很可靠,并且在生产上运行良好。


我们的工程师有着不同的编程背景,因此对于 Go 和其他编程语言,我们的观点肯定是不一样的。这就是说,Go 做的是我们在创建 Goliath 项目时“雇用”它所做的事情,我们感谢推动 Go 持续发展的团队以及围绕它建立的社区!


作者介绍:


Kevin Dangoor,可汗学院(Khan Academy)软件工程师。可汗学院是由孟加拉裔美国人萨尔曼・可汗创立的一家教育性非营利组织,主旨在于利用网络影片进行免费授课,现有关于数学、历史、金融、物理、化学、生物、天文学等科目的内容,教学影片超过 2000 段,机构的使命是让所有人享有免费的世界一流教育。


原文链接:


https://blog.khanacademy.org/half-a-million-lines-of-go/

2021 年 5 月 21 日 15:129423

评论 5 条评论

发布
用户头像
从c或c++转go的工程师,才会觉得go的语法能接受吧。太不优雅了
2021 年 05 月 31 日 09:26
回复
用户头像
登录上来评论就是想说:你们家的NET工程师是有多菜?居然觉得GO的异常处理很棒???
2021 年 05 月 30 日 18:32
回复
用户头像
这翻译完成度……还能放上邮件头条
2021 年 05 月 30 日 01:25
回复
用户头像
该评论已删除
2021 年 05 月 22 日 19:09
回复
一坨屎一样的玩意儿,还好意识说,改个配置到处找
2021 年 05 月 30 日 01:18
回复
用户头像
废话连篇
2021 年 05 月 22 日 11:01
回复
没有更多了
发现更多内容

最好的汇报是不需要汇报

伯薇

团队管理 领导力 沟通 汇报 可视化

专题:快速开发那点事儿 | 轮子怎么选

Java_若依框架教程

Java 敏捷开发 Ruoyi 快速开发

小米手机广告在日本「炸」了,背后的教训是什么?

葛仲君

产品 本地化 小米 日本 文化

地址收录

gogogo

Ubuntu 20.04 装机手册

小柒

Linux #Ubuntu #geek

牛排等级之美国篇

地藏@易果18916037281

关于 DeepL 机器翻译能力

梁帅

产品 互联网 机器翻译 谷歌Google DeepL

性能优化第一课:性能指标

kimmking

性能优化

为什么很多技术都觉得前端很简单?

极客时间

前端

央行:取消境外机构投资者额度限制,推动金融市场进一步开放

kimmking

没有业务规则的技术实现

wd

吐槽

关于架构的几件小事:架构是什么

北风

架构 企业架构

第一篇InfoQ的博客

程序员小岑

写作 体验

深入理解Java中的Lambda表达式和函数式编程的关系

jerry

Lambda java8 函数编程

IT人的职业提升只靠技术精进行的通吗?

MavenTalker

程序员 程序人生 职业规划 技术人

开源一个自研的基于Netty的高性能网络通信框架

Geek_373e87

TCP dubbo Netty

算法篇之数组右移

月夜

算法 数组右移

自助设备系列——自助设备的春天

孙苏勇

产品

这样理解Java中的函数式编程就对了

jerry

java8 函数编程

Redis学习笔记(散列类型)

编程随想曲

redis

我为什么不买Mac

Winann

效率 效率工具 Mac apple

jenkins集成maven获取远程项目

kcnf

快速开发那点事儿 | 选择最合适的轮子,量产跑车

Java_若依框架教程

敏捷开发 JAVA开发 RouYI 快速开发

MyBatis 3 解析Mapper映射配置

杨家昌

mybatis 配置 Mapper XMLMapperBuilder

【预告】千亿数据的潘多拉魔盒:从分库分表到分布式数据库

kimmking

分布式数据库 分库分表 分布式系统 中间件

hive 建表语句迁移

杨飞

iTerm2使用小技巧-密码管理器

小菜与老鸟

iTerm

Java并发编程基础--Synchronized

Java收录阁

线程

一种消息消费失败的处理方案

redis kafka

spring boot 集成 elasticsearch 7.x (一)

wd

elasticsearch high level client

讨论:应不应该用存储过程?

kimmking

“你好,元宇宙”华为云联创营元宇宙高峰论坛

“你好,元宇宙”华为云联创营元宇宙高峰论坛

从Python 2迁移到Go:虽然代码量多,但太香了-InfoQ