写点什么

CrowdStrike 为什么从 Scala 迁移到 Go

  • 2015-12-29
  • 本文字数:1346 字

    阅读完需:约 4 分钟

自 2012 年开始,安全公司 CrowdStrike 就使用 Scala 开发他们的应用程序,Scala 成为其技术栈的重要组成部分。但随着工程师团队由早期的 5 人扩大到现在 200 多人,他们决定迁移到 Go 语言技术栈。近日,该公司云计算工程部门的高级主管 Jim Plush 撰文阐述了他们采取这一举措的原因。

不过,Jim 首先声明,迁移到Go 并不是说将Scala 从CrowdStrike 的技术栈中完全清除出去,实际上,它可以补Go 之不足。Scala 是CrowdStrike 机器学习/ 分析技术栈的重要组成部分。它可以同该公司使用的Java 项目进行互操作,而且能够提供不错的DSL 供分析师使用。也就是说,Scala 更多地成为一种专用工具,而不是核心开发语言。

作为一名技术负责人,Jim 希望代码具有很好的可维护性,开发人员很容易跨项目工作,而新进人员很容易跟上项目的进展。早在2009 年尚在其他公司工作时,Jim 就开始认识到Scala 的扩展性问题。他们遇到了一个本可以几分钟解决的Bug,但却因为编写那段代码的人正在度假而花了几个小时。这说明团队出现了分化。Jim 指出,这种分化同Scala 语言本身的特点有关。通常,Scala 开发人员分化成了两个阵容:一个将其看作“更好的Java”;一个将其视为“ Applicative Functors ”。前者喜欢 Scala 的简洁性以及那些让它比 Java 更惹人爱的标准特性;后者则关注函数式编程。这两种风格没有优劣之分,但确实会导致团队的分化。而且,随着工程团队的日益壮大,这种分化会愈加明显,新进人员要跟上项目的进展就更加不易了。

当然,这不是他们迁移到 Go 的全部原因。他们还有许多与构建环境相关的痛点,如 SBT 、IDE 环境、构建时间长、JAR 包老而大,等等。另外,大量的 ScalaZ 概念和长时间的前期培训降低了开发效率。据 Jim 介绍,他们并不是唯一存在这些痛点的公司,Twitter 也经历过。因此,他得出结论:

使用 Scala,你可以拥有一个非常高效的小型团队,但当你尝试将工程团队的规模扩大到 50 人以上时就非常困难了。

相比之下,Go 存在的其中一个原因就是让开发人员更高效,限制实现方式的种类。在 Sean Berry 的鼓励下,Jim 经过深入研究发现,Go 可以解决他们使用 Scala 时在组织扩展层面上遇到的许多问题。Go 有诸多优点:构建快、二进制文件小、单文件、更好的工具、内置测试框架、性能分析器、不错的并发模型,等等。他们用 Go 逐个完成了多个项目的开发,能够使用 Go 的开发人员越来越多。开发人员加入任何一个 Go 项目都可以很快弄清楚当前正在进行的工作。使用 Go 还有一个好处,就是招聘更便利了。他们可以招聘任何语言背景的开发人员,然后进行为期数周的 Go 语言培训即可。有位起初抵制迁移的高级工程师在做完他的第一个 Go 项目后告诉 Jim:

那个库,我读了一遍就确切地知道它在做什么了,而那个库的 Scala 版本,我已经读了四遍却仍然不知道它在做什么。我知道你的伙计为什么那么喜欢它了。

现在,CrowdStrike 大部分的服务都是使用 Go 语言编写的。它们每秒处理几十万条消息,每天处理数 TB 数据。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-29 18:005705
用户头像

发布了 1008 篇内容, 共 401.6 次阅读, 收获喜欢 345 次。

关注

评论

发布
暂无评论
发现更多内容

数据库连接池 -Druid 源码学习(五)

wjchenge

Druid 数据库连接池

K8S 准入控制器有哪些是默认的?

baiyutang

Docker Kubernetes 云原生 k8s 5月月更

Druid连接池源码阅读05

石小天

网站开发进阶(六十四)CSS 属性选择器讲解

No Silver Bullet

CSS 属性选择器 5月月更

Java 集合看这一篇就够了

爱好编程进阶

程序员 后端开发

在线文本去重统计工具

入门小站

工具

druid 源码阅读(五)初始化连接池总结

爱晒太阳的大白

5月月更

架构实战营 - 毕业总结

smile

架构实战营

druid 源码阅读 5——讨论下druid为什么不用AtomicLong

张大彪

Go Web 编程入门:快速了解Fiber框架

宇宙之一粟

Go 语言 Fiber 5月月更

架构实战营模块5作业

天琪实刚亮

k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

良凯尔

容器 云原生 Kubernetes 集群 Client-go

IntelliJ IDEA如何clean或者install Maven项目

爱好编程进阶

程序员 后端开发

15-操作DOM对象

爱好编程进阶

Java 程序员 后端开发

Maven 依赖管理与生命周期

Emperor_LawD

maven 5月月更

学生管理系统(3)

5月月更

架构训练营毕业设计:电商秒杀系统

AragornYang

架构训练营 架构实战营

SpringWebFlux中WebClient怎么打印日志?

编号94530

spring 日志 WebFlux WebClient

设计模式之代理模式

乌龟哥哥

5月月更

架构训练营 毕业总结

AragornYang

架构训练营 架构实战营

在线TSV转XML工具

入门小站

工具

Nacos源码系列—订阅机制的前因后果(上)

牧小农

源码 nacos

AI简报:图像超分模型RCAN+SRResNet

AIWeker

人工智能 深度学习 5月月更 超分

ElasticSearch 概述

爱好编程进阶

Java 程序员 后端开发

一文掌握MySQL中的二进制日志,MySQL 优化学习第10天

梦想橡皮擦

5月月更

模块九作业 - 设计电商秒杀系统

smile

架构实战营

5分钟学会 Vim 分屏操作方方面面

爱好编程进阶

Java 程序员 后端开发

从AI数羊到“相牛”:人工智能应用如何低门槛化?

脑极体

有了测试组,为什么还要QA?

高山

测试 QA CMMI

MPEG-TS封装格式

Loken

音视频 5月月更

Dart 2.17发布,新特性速递

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

CrowdStrike为什么从Scala迁移到Go_Scala_谢丽_InfoQ精选文章