阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

  • 2021-05-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-05-21 15:1210389

评论 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
回复
没有更多了
发现更多内容

nginx安装配置(windows)

陈靓-哲露

硬核干货:葡萄城 SpreadJS 前端表格技术分享

葡萄城技术团队

Excel SpreadJS 表格控件 表格开发

CDN百科第八期 | 我的网站到底需不需要CDN加速?

阿里云Edge Plus

网站 CDN 云直播

实战:docker搭建FastDFS文件系统并集成SpringBoot

生命在于折腾

springboot

第四范式自动化推荐系统:搜索协同过滤中的交互函数

天枢数智运营

人工智能 推荐系统 搜索

第八周作业

田振宇

如何设计一个亿级消息量的IM系统

Chank

Java Architecture Architect IM Instant Messaging

一个小实验,来

池建强

算法 薪资

原创 | 使用JPA全面实现DDD持久化【关于本书】

编程道与术

Java hibernate DDD JDBC jpa

BIGO技术 | Paxos的工程实践与极致优化

InfoQ_3597a20b53cc

BIGO

蚂蚁上市:P7可获1200万元期权,酸酸酸酸酸...

程序员生活志

互联网热点 蚂蚁金服

百万并发「零拷贝」技术系列之Java实现

码农神说

Java 架构 高性能 零拷贝

敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿

华为云开发者联盟

产品设计 敏捷开发 后端 地图 开发流程

【好书推荐】《Python黑魔法指南》-附高清PDF版

华为云开发者联盟

Python 开发者 书摘 python3.7 书籍推荐

池化技术到达有多牛?看了线程和线程池的对比吓我一跳!

王磊

Java

真香!Linux 原来是这么管理内存的

cxuan

Linux 操作系统

判断链表相交

GalaxyCreater

算法

计算机网络基础(十)---网络层-迪杰斯特拉算法

书旅

算法 计算机网络 网络 最短路径

什么是数字孪生,它的应用价值在哪里?

华为云开发者联盟

AI IoT 数字化 汽车电子 工业互联网

LeetCode题解:142. 环形链表 II,JavaScript,快慢指针,详细注释

Lee Chen

大前端 LeetCode

4. JSON字符串是如何被解析的?JsonParser了解一下

YourBatman

Jackson JSON库

案例解读:深入理解浏览器的缓存机制

华为云开发者联盟

缓存 浏览器 服务器 缓存穿透 华为云

BIGO技术 | Paxos的工程实践与极致优化

InfoQ_3597a20b53cc

技术

《深度工作》学习笔记(2)

石云升

学习 专注 深度工作

到底一台服务器能够支持多少TCP并发连接?

南方有乔木兮

顺势昌,逆势亡:人啊,得学会做信天翁,而不是鹧鸪鸟

非著名程序员

创业 程序员 管理 提升认知

服务器是什么?其作用及有哪些分类?

德胜网络-阳

服务器

将Arch Linux安装到U盘

Kurtis Moxley

Linux 安装操作系统

当远程工作成为未来的工作方式......

Atlassian

Atlassian Jira

如何成为一个成功的首席数据官

麒思妙想

What's New in Dubbo-go v1.5

apache/dubbo-go

dubbo Go 语言

从Python 2迁移到Go:虽然代码量多,但太香了_架构_Kevin Dangoor_InfoQ精选文章