技术栈从Scala到Go

Jim Plush是网络安全服务提供商CrowdStrike的云工程高级总监。CrowdStrike由McAffee的前CTO George Kurtz及前副总裁Dimitri Alperovitch于2011年创建。

Scala是CrowdStrike内部使用的主要语言。2011年,Jim主导了Scala的使用。 在加入CrowdStrike之前,Jim就职的Gravity公司也是Scala重度用户。前段时间,他们将技术栈从Scala转向了Go。

Jim Plush从技术总监的角度介绍了这种变化。随着业务增长,公司的工程师从5个增长到200多个。需要考虑的是,如何让code base便于维护,工程师可以轻松跨项目交流,新人能够快速上手。

几年前,Jim曾遇到一个问题。当时产品中出现了一个会影响大量客户的严重问题。于是他们开始研究问题所在,跟踪代码的修改记录。后来发现了一个从未见过的符号: <|*|>   。当时就有人大喊:“这TMD什么玩意儿?” 想跟进这个方法,也没有成功。Google也搜不到什么。

相关的开发人员正好在外度假。如果有code review机制,或许能避免此类问题,可惜当时没有。后来大家发现,项目中引入了一个叫 scalaz  的库。终于在这个库中找到了那个神奇的符号,问题得以解决。

Scala是一门强大的语言,有学术背景,而且非常灵活。通常可以将Scala开发者分为两类,一类是将Scala看作更好的Java,喜爱Scala的简洁;一类是偏爱函数式编程,愿意深入挖掘,或者把在Haskell之类函数式语言上积累的经验带了过来。

有些代码用函数式风格写出来可能非常简洁。但是随着团队规模不断扩大,如果有很多人读不懂,问题就会凸显。新人也很难直接上手。

Scala也有一些不够完善的地方,像sbt、IDE有些痛点,另外还存在构建缓慢,JAR文件较大等问题。

这种问题并不鲜见,Twitter等公司也经历过同样的扩张之痛。 如果是小团队,使用Scala可能非常高效;但在工程团队超过50人之后,使用Scala会面对很大的挑战。

而Go语言诞生的目标之一就是让开发更高效,限制了可选的表达方式,而且在编译层面施加了很多限制。

是否选择Go,公司内部也有很多争论。关于是否采用某个新技术,CrowdStrike有一个策略: 如果产品出了问题,至少有3个人愿意在凌晨3点提供支持 。在Jim的不断推动之下,Go进入CrowdStrike的技术栈。Jim同时发现,原来面对的很多Scala的问题,Go都能很好地解决。比如构建速度很快,有很多不错的工具,内建了测试框架,有分析器,还有很好的并发模型。

从一个示例项目入手,取得成功。后来一个又一个的项目采用了Go,这方面的开发者也越来越多。开发人员可以跳到任何一个项目,并立即知道其作用。可维护性方面的好处就不用提了。

另外,这也 扩大了招聘池 。可以选择有其他任何语言背景的人,培训几周Go,很快就能上手。招聘Scala开发者则要困难很多。

有个不愿意切换到Go的同事,在用Go写了第一个项目之后,感慨不已:Go语言的库,读了一遍就知道是干什么的了,而Scala的版本读了四遍,还感觉迷迷糊糊。

当然,Jim也提到,他并不是苛责Scala,有些雄心勃勃的新项目还是会用Scala编写;但 如果工程团队不断扩张 ,则不会再将Scala用作核心语言。而且, Scala并没有完全从CrowdStrike的技术栈中移除。一些Go不太擅长的领域,Scala还是不错的补充,比如机器学习和分析方面,需要与Java项目互操作的地方。另外,提供不错的DSL供分析师使用,这方面Scala也是不二之选。总体而言,Scala更多变成了一种专用工具,不再是核心开发语言。

当然,关于编程语言的话题总是能引起很多争论。Hacker News上就有很多讨论。有人认为,不要把差劲程序员的问题归到语言上。Scala代码写不好的人,未必能写好Go代码。也有人认为应该 加强code review,不能让开发人员随意引入第三方库 。应该参考一些Scala最佳实践,比如:https://github.com/alexandru/scala-best-practices。更多讨论,可以点击“查看原文”。

Kevin Scott(SVP Eng & Ops @ LinkedIn)在Quora上回答“Is LinkedIn getting rid of Scala?”这个问题时,也提到LinkedIn在下一代的基础架构中,会减少对Scala的依赖,而是以Java 8、C++和Python等语言为主。

像Apache Storm,是以Clojure实现的。2.0版本则有可能基于阿里巴巴用Java实现的JStorm。后来Twitter内部开发的Storm替代产品Heron,则选择了Java,部分性能要求较高的代码选择了C++。

在团队规模不断扩大,招人困难的情况下,选择简单、易上手的语言,可能是最现实的选择。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章