你在使用哪种编程语言?快来投票,亲手选出你心目中的编程语言之王 了解详情
写点什么

选 Scala 还是 Go,一个很现实的问题

2019 年 10 月 09 日

选Scala还是Go,一个很现实的问题


知乎有一个问答:如果对方是一个 Scala 爱好者,有什么办法说服他使用 Go?


有朋友表示,你不被他说服用 Scala 就很不错了。


也有不少朋友十分有原则:请打钱,谢谢,双倍工资也可以,不挑。反正只要钱到位,你让我写汇编都行。


还有一位 PHP/C 程序员趁机发问,假设你是 Go 的爱好者,我该如何说服你用 PHP?另一位回:杀了我吧,宁死不屈。


直钩钓鱼,又是一场语言之战,但从这个问题底下的回答来看,Scala 爱好者的心并不是那么容易动摇。


Scala vs Go

但在比较 Scala 与 Go 时,国外的垂直化产品推荐社区 Slant 却为大多数人推荐 Go。



在“首先学习的最佳编程语言是什么?”这一问题中, Go 排名第 13,Scala 排名第 17。在“什么是最好的服务器端编程语言”和“后端开发人员学习的最佳编程语言是什么?”以及“并发编程的最佳语言是什么”等问题中,Go 的排名都高于 Scala。



程序员们还分别就 Scala 和 Go 的优缺点展开了小范围的讨论,从支持者的气势来看,Go 语言无疑是赢家——关于 Scala 的评论数量远小于 Go 语言。


一些 Scala 的拥护者表示——


  • Scala 支持函数式和面向对象的编程风格。新玩家可以学习这两种范式而无需学习新语言,资深玩家可以根据当时最适合他们需求的方式在两者之间切换。

  • Scala 提供类型推断,虽然它提供与 Java 类型系统相同的安全性,但允许程序员专注于代码本身,而不是更新类型注释。

  • 除了 Java 本身,Scala 在 JVM 语言中的热度算得上是数一数二的。如果你正在做 Android 或类似的 JVM-only 平台开发,或者既要开箱即用的跨平台兼容性,又要性能,Scala 是一条可行之路。

  • 它的不可变值使其非常适合处理并发。

  • 它有针对可重用和安全代码的富有表现力的函数式编程抽象。


Go 语言的优势也很明显——简单,快速,有爸爸。


  • 人们选择 Go 的一个重要原因是,Goroutines 是运行在 OS 线程上的“轻量级线程”。它们为并发操作提供了一种简单的方法——在函数前加上 go 将同时执行它。它利用 Goroutine 之间的通信渠道,防止冲突,并使跨 Goroutine 的同步执行变得毫不费力。还可以在编译时使用 GOMAXPROCS 变量定义 goroutine 可以运行的最大 OS 线程数。

  • Go 非常快速,其性能与 Java 或 C++ 相似,但比 Python,JS,Ruby 或许多其他动态语言更容易编写。它简化了语法,只有被认为是关键的功能才会添加到语言中,这使得它足够小,容易记忆,减轻了程序员和编译器开发人员的负担。

  • 另外,Go 语言还有一个闪亮的身份,富二代。它出身于 Google,背后站着一堆牛气哄哄的作者,Facebook、Uber、今日头条、滴滴等公司都在使用它、研究它,这代表着,有一大堆优秀工程师正在为它的发展添砖添瓦。


瞧瞧这世道,不仅人要拼爹,语言也得拼爹。


从 Scala 到 Go

如果是你来做选择,你会选择选 Scala 还是 Go?


这是一道很现实的问题。国内用 Scala 写后端的公司并不多,大部分都是用来做数据开发,如果你想找一个不做 Spark 的 Scala 工作,还真挺难……


究其原因,可能有以下几点:Scala 为新开发人员带来了较为陡峭的学习曲线,那么团队新血液的加入注定是一份不小的花销,所以一般的公司还真有点拿不下 Scala。设想一下,假如 Scala 项目的核心人员离职了……Scala 还有一些难点,比如 SBT、IDE 环境、构建缓慢、JAR 文件较大,等等。


这些问题也是令 Scala 采用先驱之一的 Twitter 头痛的原因,Raffi Krikorian 曾任 Twitter 平台工程副总裁,他负责 Twitter 的后端基础架构,也是负责在推特上引入 Scala 的人之一。当他被问到如果必须再次选择是否还会选择 Scala 的问题时,他的答案是,不确定。


因为 Scala 的诸多痛点,曾把 Scala 当成技术栈重要组成部分的网络安全服务提供商 CrowdStrike,在工程师团队由早期的 5 人扩大到 200 多人的时候,决定迁移到 Go 语言技术栈。在引入 Go 之后,他们发现,原来 Scala 可能会遇到的问题,比如构建速度、SBT 等,对 Go 语言来说,都不是问题。Code Base 好维护了,代码容易看懂了,新人可以快速上岗了,工程师可以跨项目交流了。CrowdStrike 的云工程高级总监 Jim Plush 不由感叹,如果是小团队,使用 Scala 会非常高效,但当团队规模扩大到 50 人以上,你就会面临很大的挑战。


2017 年,Vista Group International Ltd 旗下的电影行业营销数据分析和活动管理解决方案公司 Movio 曾发布一篇文章,Making The Move From Scala To Go, And Why We’re Not Going Back,用中文说就是从 Scala 迁移到 Go,永不回头。这篇文章发布后受到了很多关注,一些读者认为这是对 Scala 的 diss。面对诸多质疑,Movio 解释了他们从 Scala 迁移到 Go 的原因,列举了 Scala 的部分问题和 Go 的优点,并表示,虽然他们选择从 Scala 迁移到 Go,并逐步将 Scala 代码库的一部分重写为 Go,但 Scala 仍然是 Movio 的一些小队的主要语言,也就是说,在 Movio ,Scala 和 Go 共存。


文章的最后有一句话,技术栈需要根据自身情况去选择,所以他们选择了 Go。确实如此,虽然语言爱好者会为自己使用的语言进行辩护,但其实大家都知道,每一种语言都有自己的适用场景,想用一种语言干完所有的事情绝无可能。所以现在公司很多都是多语言公司,他们会把对的语言用在对的产品上,就像 Go 语言适合做网络并发的服务,那它就会被用于推送监控等项目,而 Scala 适合大型工程项目,写起来很爽,可以替代 Java 做应用级开发。


编程语言是程序员的第一工具,启动一个新项目,少不了编程语言的选型问题。QCon 上海 2019 设置“编程语言”专题,和你从冷门但有趣的 Pony、不那么主流但实用的 Scala、JavaScript 的新特性,聊到老而弥坚的 Java、冉冉升起的新星 Go,你会发现自己从来没有真正认识过 SQL,还将知道为何使用 .NET 的公司很少 996,点此了解详情。


2019 年 10 月 09 日 11:325812

评论

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

能上能下

张老蔫

28天写作

最新区块链科普图书《区块链进化史》上市

CECBC区块链专委会

区块链 科普

APICloud AVM多端开发 | 企业app开发解析:案例展示、加盟申请功能源码

APICloud

小程序flutter, 跨平台 前端框架 前端教程 APICloud

大作业(一)

橘子皮嚼着不脆

极客时间架构 1 期:大作业一 根据业务编写指定输出系统概要设计

Null

即时通讯的原理和历史

v16629866266

强!腾讯老兵亲荐“从零开始学架构”教你如何成为出色的架构师?(整整2000页的笔记)

比伯

Java 编程 架构 面试 程序人生

智慧公安情报研判系统解决方案-智慧公安系统建设

135深圳3055源中瑞8032

别小看 Log 日志,它难住了我们组的架构师

Java架构师迁哥

大作业一

fmouse

架构师训练营第 1 期

大作业二

fmouse

架构师训练营第 1 期

去中心化DAPP系统APP开发|去中心化DAPP软件开发

开發I852946OIIO

系统开发

DeFi去中心化DAPP系统开发的知识科普

W13902449729

去中心化金融 DeFi去中心化系统开发

大作業(一)(PPT)

Christy LAW

区块链药品防伪追溯,区块链疫苗溯源监管平台

135深圳3055源中瑞8032

重学JS | 聊聊闭包

梁龙先森

前端 编程语言 28天写作

有技术和落地,区块链才能创造价值

CECBC区块链专委会

区块链

搭建自己的MinDoc文档库

后台技术汇

28天写作

【JS】函数实参与形参

学习委员

JavaScript 前端 js 28天写作

Java并发编程实战(2)- Java内存模型

技术修行者

Java 并发编程 happens-before 多线程

单向链表合并实战

andy

RocketMQ学习笔记

大刘

RocketMQ MQ 消息队列

大作业(二)

橘子皮嚼着不脆

大作業(二)mindmap

Christy LAW

HDFS SHELL详解(2)

罗小龙

hadoop 28天写作 hdfs shell

智慧安防社区平台搭建智慧社区系统功能介绍

135深圳3055源中瑞8032

[0/28]软件质量的那点事(1)———引言

俊毅

软件测试 软件质量

智慧城市发力,区块链助力土木建设数据存储

CECBC区块链专委会

土木建设

太过完美!滴滴全球首发Spring5+SpringMVC5+Mybatis3.X全彩小册

Java架构追梦

Java 源码 架构 滴滴 ssm

极客时间架构 1 期:大作业二 学习大总结

Null

金三银四将至!我肝了万字的Java垃圾回收,看完你还敢说不会?

云流

编程 JVM Java 面试

云原生场景下企业API 网关选型及落地实践

云原生场景下企业API 网关选型及落地实践

选Scala还是Go,一个很现实的问题-InfoQ