写点什么

从 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:1210999

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

手写一个react,看透react运行机制

goClient1992

React

带你实现react源码的核心功能

goClient1992

React

15年磨一剑,亚马逊云科技数据产品掌门人 Swami 揭秘云原生数据战略的三大关键要素

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

参加前端培训之后能做什么?

小谷哥

cookie sessionStorage localStorage区别(详解)

达摩

缓存 Web Cookie LocalStorage sessionStorage

连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

小小怪下士

Java 程序员 分布式 架构设计

深入React源码揭开渲染更新流程的面纱

goClient1992

React

如何通过Java将Word转换为PDF

Geek_249eec

Java PDF word

面试官:两个JVM的面试题就能证明,你连拿15K都不配

钟奕礼

Java 程序员 java面试 java编程

从今天起真正释放创造力 | Werner Vogels 在 re:Invent 2022带来多项开发者福音

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

面试官:你先回去等通知吧!这个Java岗位我还有机会吗?

钟奕礼

Java java面试 java编程 程序员、

react源码分析:组件的创建和更新

flyzz177

React

Log4Shell 漏洞披露已近一年,它对我们还有影响吗?

SEAL安全

Log4Shell 12 月 PK 榜

前端培训学习后程序员有什么好的方向吗

小谷哥

react源码分析:实现react时间分片

flyzz177

React

Industrial wifi6 Wireless AP/DR AP6018 S AIPQ6010 2T2R 2.4G&5G high power Radio AP

Cindy-wallys

IPQ6010 high power 2.4G&5G

2023来袭,分享500道我收集的Java架构面试题

钟奕礼

Java 程序员 java面试 java编程

一个月面试了3家大厂Java岗,我发现这几个突破点

钟奕礼

Java 程序员 java面试 java编程

双机互备是什么意思?双机互备就是双机热备吗?

行云管家

双机热备 双机互备

信息安全等级保护的5个级别分别是什么?最高级别是哪个?

行云管家

等保 等级保护

大数据培训学习的技术基础有哪些

小谷哥

【iOS逆向与安全】iOS插件开发光速入门

小陈

为什么我们不支持手工上传镜像

Jianmu

Docker 容器 镜像

觅健牵手博鳌医院战略合作:即时优享全球肿瘤创新治疗方案

联营汇聚

java程序员培训零基础怎么学

小谷哥

26个月89场Java岗面试,0至3年程序员的入职门槛到底是什么?

钟奕礼

Java 程序员 java面试 java编程

react源码分析:深度理解React.Context

flyzz177

React

HummerRisk 入门3:开发手册

HummerCloud

云安全 云原生安全 12月月更

盘点 | 4类爆款小游戏开发引擎

FinFish

游戏引擎 小游戏 小游戏开发 微信小游戏 游戏开发引擎

手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升

易观分析

手机银行 用户

大数据培训程序员就业前景如何

小谷哥

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